【问题标题】:Non-greedy pattern with advance characters具有高级字符的非贪婪模式
【发布时间】:2019-10-30 21:39:50
【问题描述】:

我有一个想要匹配的简单模式。在这句话中:

great. This is great&great&great. great.

我想在“这是”之后立即匹配“伟大”的词。所以第一个伟大的将返回,但接下来的三个必须返回。最后一个不应该。

我的表情是

This is (great&)*?(great)

但这只会返回第一个伟大的。我阅读了有关贪婪和非贪婪模式的信息,当我不必担心“这是”的提前时,它的效果很好。但是这些高级字符检查对我的用例很重要。我将如何获得所需的结果?

我能够做到这一点:

This is (great&){0}(great)

对于第一场比赛,

This is (great&){1}(great)

第二个,依此类推。但这是一个繁琐的解决方案,我认为我遗漏了一些关于非贪婪模式的行为。感谢任何帮助。谢谢!

【问题讨论】:

  • 编辑了问题以更准确地反映我的问题。早些时候,关于最后一个“伟大”的条件不存在。

标签: python regex python-3.x regex-greedy


【解决方案1】:

一种选择是使用alternation 并匹配您不想要的内容,并在字边界之间为great 使用捕获组。

^.*?This is |\b(great)\b
  • ^ 字符串开始
  • .*?This is 使用惰性量词匹配 This is 的第一次出现 .*?
  • |
  • \b(great)\b 在第 1 组的单词边界之间捕捉精彩

查看Regex demo

更新

更新问题的一个可能解决方案可能是在一个交替中使用 2 个积极的后视。

(?:(?<=\bThis is )|(?<=\S))\bgreat\b
  • (?:非捕获组
    • (?&lt;=\bThis is ) 正面向后看,断言左边是This is
    • |或者
    • (?&lt;=\S) 正面向后看,断言左边是非空白字符
  • )关闭非捕获组
  • \bgreat\b 单词边界之间的匹配度很好

Regex demo

【讨论】:

  • 谢谢。这是一个有趣的答案。这给我带来了一个额外的问题。如果下一句中有一个“伟大”,我不希望这被捕捉到。我将修改问题以反映这一点。我该如何解决?
  • @Pradical2190 这实际上改变了问题。我目前的答案反映了最初的问题。匹配 3 次伟大但不匹配最后一次的规则是什么?
  • 同意并点赞!但是很抱歉,您的方法引发了我之前没有预料到的问题。
  • @Pradical2190 也许像这样regex101.com/r/ynGy43/1
  • 完美!你能更新答案吗?我会接受的。如果可能的话,一个解释会很好。
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多