不考虑顺序的某些词的正则表达式

25 投票
2 回答
18973 浏览
提问于 2025-04-18 12:38

我想写一个正则表达式,用来查找一些单词,但这些单词出现的顺序不重要。

比如说,我想查找“Tim”和“stupid”。我现在的正则表达式是 Tim.*stupid|stupid.*Tim。但是有没有办法写一个更简单的正则表达式(比如说,让这两个单词在正则表达式中只出现一次)呢?

2 个回答

7

你可以使用正向前瞻来实现这个功能。前瞻的方法很适合匹配那些包含两个子字符串的字符串,不管它们的顺序如何。

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

看看这个正则表达式:

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

正则表达式解释:

  • ^ 表示字符串的开始位置。
  • (?=.*Tim) 确保字符串中包含“Tim”。
  • (?=.*stupid) 确保字符串中包含“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!']

了解更多:

撰写回答