【问题标题】:How to exclude specific string using regex in Python?如何在 Python 中使用正则表达式排除特定字符串?
【发布时间】:2014-08-10 07:12:31
【问题描述】:

我想匹配如下字符串:

45 meters?
45, meters?
45?
45 ?

但不是这样的字符串:

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

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

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

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

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

【问题讨论】:

  • you 可以出现在字符串的任何位置,还是只出现在末尾?
  • 它可能在任何地方,但现在我很感兴趣,当它出现在最后时,谢谢。
  • 我的意思是“任何地方”,在 you? 之间可能会有一些空格。
  • 你可以试试\d+.*?(?<!you\?)$,但它也会匹配45 you ?。你不能这样做 (?<!you\s*\?) 因为lookbehinds(在大多数情况下)需要是固定长度的。
  • 正则表达式是强制性的吗?你可以这样:"you" in mystring

标签: python regex substring


【解决方案1】:

你可以试试这个正则表达式来匹配所有没有字符串you的行,最后是?

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

说明:

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

DEMO

【讨论】:

  • 如果单词是you,OP 只希望它丢弃匹配项。
  • 抱歉,我需要.,因为它甚至应该匹配45, meters?
  • 你想要这个^[\d,]+ ?(\w+)?\?$吗?
  • 更好,但同样,正如@AmalMurali 所说,它失败了42 test meters?
  • 是的,我认为第二个是最好的,但我会在^(?!.*you).*\?$' 中更改它,因为正如我所写的,我还需要字符串末尾的问号。谢谢!!!
【解决方案2】:

有一个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。我正在用相同的方法写一个答案,但你更快。
猜你喜欢
  • 2012-02-17
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多