正则表达式存在一些其顺序无关紧要的单词

Tim*_*Tim 16 python regex string string-matching regex-lookarounds

我想写一个正则表达式来搜索某些单词的存在,但它们的出现顺序无关紧要.

例如,搜索"Tim"和"stupid".我的正则表达式是Tim.*stupid|stupid.*Tim.但是有可能编写一个更简单的正则表达式(例如,这样两个单词在正则表达式中只出现一次)?

Uni*_*ron 39

看到这个正则表达式:

/^(?=.*Tim)(?=.*stupid).+/
Run Code Online (Sandbox Code Playgroud)

正则表达式解释:

  • ^ 在字符串开头处断言位置.
  • (?=.*Tim) 断言"Tim"出现在字符串中.
  • (?=.*stupid) 断言字符串中存在"愚蠢".
  • .+现在我们的短语存在,这个字符串是有效的.继续使用.+或 - .++匹配整个字符串.

要更专注地使用先行,您可以添加另一个(?=.*<to_assert>)组.整个正则表达式可以简化为/^(?=.*Tim).*stupid/.

一个正则表达式演示!

>>> 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!']
Run Code Online (Sandbox Code Playgroud)

阅读更多:

  • 就是这样,+1 :) ......如果有人使用它,可以进行一些评论:`^`特别重要,因为没有它,如果在字符串开头的前瞻失败,引擎将移动到下一个位置,然后再试一次.另一方面,```可以被删除,因为`.+`保证我们将到达字符串的末尾. (3认同)

hwn*_*wnd 7

您可以使用Positive Lookahead来实现此目的.前瞻方法很适合匹配包含两个子串的字符串而不管顺序如何.

pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$')
Run Code Online (Sandbox Code Playgroud)

示例:

>>> s = '''Hey there stupid, hey there Tim
Hi Tim, this is stupid
Hi 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']
Run Code Online (Sandbox Code Playgroud)