【问题标题】:Regex captures one instance of the pattern but not the other. How to fix this?正则表达式捕获模式的一个实例,但不捕获另一个。如何解决这个问题?
【发布时间】:2012-08-08 20:16:34
【问题描述】:

我有这段文字:

W/NNP Yes/NNP Get/NNP Paid/NNP for/IN Going/NNP to/TO College/NNP !/. 检查/NNP it/PRP out/RP here/RB !/. http/NN:/: //sldollar.notlong.com/JJ apple/NN iphone/NN TGIF/NNP 猪/NN 流感/NN

我目前正在使用这个正则表达式来捕获一些感兴趣的区域:

[a-zA-Z]*/NN[PS]* [a-zA-Z]*/NN[PS]*

我正在使用RegexPal 进行测试。

这会捕获TGIF/NNP swine/NN,但不会捕获swine/NN flu/NN。有关如何修复我的正则表达式以捕获此问题的任何建议?

【问题讨论】:

  • 原因是有些匹配重叠了。
  • @Maulwurfn:是的。谢谢你。刚刚意识到这可以使用积极的前瞻来解决并发布我的答案。
  • @Maulwurfn:+1 感谢您的链接。
  • @tripleee:嗯,类似的,只是我没有处理垃圾邮件;)

标签: python regex text


【解决方案1】:

如果其他人需要这个,我想答案是使用积极的前瞻:

([a-zA-Z]*/NN[PS]* )(?=([a-zA-Z]*/NN[PS]*))

【讨论】:

    【解决方案2】:

    多个匹配项不能重叠。

    apple/NN iphone/NN TGIF/NNP swine/NN flu/NN
    AAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBB
             CCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDD
    

    上面标记为 A 和 B 的匹配相互跟随,但由于 C 块从匹配 A 的中间开始(对于 B 中的 D 也是如此),它们不是匹配。

    您需要匹配一次,然后在上一个起点之后的某个点重新搜索,或者使用前瞻,这样后一部分就不会被消耗。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      相关资源
      最近更新 更多