如何在 Python 中使用正则表达式排除特定字符串?

f_f*_*ola 4 python regex substring

我想匹配以下字符串:

45 meters?
45, meters?
45?
45 ?
Run Code Online (Sandbox Code Playgroud)

但不是像这样的字符串:

45 meters you?
45 you  ?
45, and you?
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,问号都必须在末尾。所以,基本上我想排除所有包含“你”这个词的字符串。

我尝试了以下正则表达式:

'\d+.*(?!you)\?$'
Run Code Online (Sandbox Code Playgroud)

但它匹配第二种情况(可能是因为.*

Avi*_*Raj 8

你可以试试这个正则表达式匹配所有不具备串线you?在最后,

^(?!.*you).*\?$
Run Code Online (Sandbox Code Playgroud)

解释:

在这个正则表达式中使用了负前瞻。它实际上意味着什么,它会检查包含 string 的行you。它匹配除包含字符串的行之外的所有行you

演示

  • 抱歉,但我需要“.”,因为它甚至应该匹配“45,米?” (2认同)

Zer*_*eus 8

有一个巧妙的技巧可以从正则表达式中排除一些匹配项,您可以在此处使用:

>>> import re
>>> corpus = """
... 45 meters?
... 45?
... 45 ?
... 45 meters you?
... 45 you  ?
... 45, and you?
... """
>>> pattern = re.compile(r"\d+[^?]*you|(\d+[^?]*\?)")
>>> re.findall(pattern, corpus)
['45 meters?', '45?', '45 ?', '', '', '']
Run Code Online (Sandbox Code Playgroud)

不利的一面是,当排除开始时,您会得到空匹配项,但这些匹配项很容易被过滤掉:

>>> filter(None, re.findall(pattern, corpus))
['45 meters?', '45?', '45 ?']
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

诀窍是我们只关注捕获的组......所以交替的左侧 - \d+[^?]*you(或“数字后跟非?-字符后跟'你'”)匹配你想要的,并且然后我们就忘了它。仅当左侧不匹配时,右侧 - (\d+[^?]*\?)(或“数字后跟非?-字符后跟 '?') - 匹配,并且捕获那个。

  • +1。我正在用同样的方法写答案,但你更快。 (3认同)