Regex for existence of some words whose order doesn't matter
See this regex:
/^(?=.*Tim)(?=.*stupid).+/
Regex explanation:
^
Asserts position at start of string.(?=.*Tim)
Asserts that "Tim" is present in the string.(?=.*stupid)
Asserts that "stupid" is present in the string..+
Now that our phrases are present, this string is valid. Go ahead and use.+
or -.++
to match the entire string.
To use lookaheads more exclusively, you can add another (?=.*<to_assert>)
group. The entire regex can be simplified as /^(?=.*Tim).*stupid/
.
See a regex demo!
>>> import re>>> str ="""... Tim is so stupid.... stupid Tim!... Tim foobar barfoo.... Where is Tim?""">>> m = re.findall(r'^(?=.*Tim)(?=.*stupid).+$', str, re.MULTILINE)>>> m['Tim is so stupid.', 'stupid Tim!']>>> m = re.findall(r'^(?=.*Tim).*stupid', str, re.MULTILINE)>>> m['Tim is so stupid.', 'stupid Tim!']
Read more:
You can use Positive Lookahead to achieve this. The lookahead approach is nice for matching strings that contain both substrings regardless of order.
pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$')
Example:
>>> s = '''Hey there stupid, hey there TimHi Tim, this is stupidHi Tim, this is great'''...>>> import re>>> pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$', re.M)>>> pattern.findall(s)# ['Hey there stupid, hey there Tim', 'Hi Tim, this is stupid']