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

时间:2014-06-19 16:34:16

标签: python regex substring

我想匹配以下字符串:

45 meters?
45, meters?
45?
45 ?

但不是字符串:

45 meters you?
45 you  ?
45, and you?

在这两种情况下,问号必须在最后。所以,基本上我想要排除所有包含单词"你"。

的字符串

我已尝试过以下正则表达式:

'\d+.*(?!you)\?$'

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

2 个答案:

答案 0 :(得分:4)

neat trick从正则表达式中排除某些匹配项,您可以在此处使用:

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

缺点是,当排除开始时你会得到空的匹配,但这些很容易被过滤掉:

>>> filter(None, re.findall(pattern, corpus))
['45 meters?', '45?', '45 ?']

工作原理:

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

答案 1 :(得分:3)

您可以尝试使用此正则表达式来匹配最后没有you字符串?的所有行,

^(?!.*you).*\?$

<强>解释

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

DEMO