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

Posted

技术标签:

【中文标题】存在一些顺序无关紧要的单词的正则表达式【英文标题】:Regex for existence of some words whose order doesn't matter 【发布时间】:2014-08-30 14:57:56 【问题描述】:

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

例如,搜索“Tim”和“stupid”。我的正则表达式是Tim.*stupid|stupid.*Tim。但是是否可以编写一个更简单的正则表达式(例如,这两个词在正则表达式本身中只出现一次)?

【问题讨论】:

如果顺序无关紧要,您不能将其分成两个搜索,如果这对您来说更简单 你想匹配包含 Tim 和愚蠢字符串的整行吗? 【参考方案1】:

查看这个正则表达式:

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

正则表达式解释:

^ 在字符串开头断言位置。 (?=.*Tim) 断言字符串中存在“Tim”。 (?=.*stupid) 断言字符串中存在“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!']

了解更多:

Regex with exclusion chars and another regex

【讨论】:

就是这样,+1 :) ... 一点评论以防有人使用它:^ 特别重要,因为没有它,如果前瞻在字符串的开头失败,引擎将移动到下一个位置并重试。另一方面,$ 可以被删除,因为.+ 保证我们将到达字符串的末尾。【参考方案2】:

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

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

【讨论】:

以上是关于存在一些顺序无关紧要的单词的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

带有字母、数字、任意顺序的可选特殊字符的正则表达式单词

以任何顺序匹配查询中的所有单词的正则表达式

NLTK 正则表达式和 CFG

正则表达式快速入门

不包含多个特定单词的字符串的正则表达式

正则表达式仅匹配大写“单词”,但有一些例外