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

时间:2014-07-09 14:15:16

标签: python regex string string-matching regex-lookarounds

我想写一个正则表达式来搜索某些单词的存在,但它们的出现顺序并不重要。

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

2 个答案:

答案 0 :(得分:35)

请参阅此正则表达式:

/^(?=.*Tim)(?=.*stupid).+/

正则表达式解释:

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

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

请参阅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!']

了解详情:

答案 1 :(得分:6)

您可以使用正面预测来实现此目的。前瞻方法很适合匹配包含两个子串的字符串,无论顺序如何。

pattern = re.compile(r'^(?=.*Tim)(?=.*stupid).*$')

示例

>>> 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']