Regex for existence of some words whose order doesn't matter
python, regex, regex-lookarounds, string, string-matching
Solution
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:
- Regex with exclusion chars and another regex
Problem
I would like to write a regex for searching for the existence of some words, but their order of appearance doesn't matter. For example, search for "Tim" and "stupid". My regex is `Tim.*stupid|stupid.*Tim`. But is it possible to write a simpler regex (e.g. so that the two words appear just once in the regex itself)?