正则表达式:标点符号和贪婪

时间:2012-11-12 19:12:15

标签: python regex

让我们说这是我们的文字:

text = 'After 1992 , the winter and summer Olympics will be held two years apart , with the revised schedule beginning with the winter games in 1994 and the summer games in 1996 . ) Now , Mr. Pilson -- a former college basketball player who says a good negotiator needs `` a level of focus and intellectual attention  similar to a good athlete-s is facing the consequences of his own aggressiveness . Next month , talks will begin on two coveted CBS contracts'
print re.search(r'(\w+ |\W+ ){0,4}1992( \W+| \w+){4}', text).group(0)
  

输出: 1992年以后,冬天和

但是这个给了我:

print re.search(r'(\w+ |\W+ ){0,4}1992( \W+| \w+){0,4}', text).group(0)
  

输出: 1992年以后,

对我来说这似乎很奇怪,因为为什么第二个正则表达式并不贪心?

这个比其他人有点奇怪:

print re.search(r'(\w+ |\W+ ){0,4}summer( \W+| \w+){0,4}', text).group(0)
  

输出,将举办冬季和夏季奥运会

问题

1-第一个和第二个之间有什么区别。对我来说,它应该提供相同的文本,因为唯一的区别是{0,4},如果{4}给出长字符串,{0,4}应该给出相同的字符串,因为正则表达式是贪婪的。

2-问题可能与标点符号有关,因为第三个示例同样适用于{0,4}{4} ..

我很困惑。

1 个答案:

答案 0 :(得分:4)

这里没有神秘感。

在您的第二个示例中,␣\W+匹配␣,␣(空白也是\W类的一部分),因此找不到{{1}的后续匹配项}对于剩余的␣\w+ - 但the␣winter␣...约束已得到满足,因此不需要进一步匹配。到目前为止一切都很好。

回到你的第一个例子,上面的匹配不满足{0,4},所以引擎一直在寻找。在{4}匹配中,它回溯了最后一个空白␣\W+,因此仅匹配␣\W+,然后可以针对␣,␣\w+进行3次后续匹配} - 和␣the␣winter␣...感到满意。

将正则表达式更改为{4}(这样可以保持原始表达式的精神,将空格视为分隔符,将其他所有内容,包括标点符号视为单词),或者更好的是([^ ]+ +){0,4}my_word( +[^ ]+){0,4}来隔离不管标点符号如何,两边最多4个实际单词。

<强>后来

  

你好vladr。您提供的正则表达式无法使用   本文(目标词是本文的一部分):

     
    

纽约市消费者事务部负责收购Newmark&amp;路易斯公司未能兑现其降价承诺。在纽约州最高法院开始的民事诉讼中,该机构声称消费电子和家电折扣零售连锁店通过声称“降低每件商品的每一个价格”作为广告的一部分进行欺骗性广告。从6月1日开始的活动。该机构表示,它监控纽马克&amp;刘易斯在广告宣传前后的广告价格,发现至少50种不同商品的价格增加或保持不变。 5月下旬,Newmark&amp;刘易斯宣布了一项计划,将价格降低5%至20%,并取消所谓的“与客户谈判个人交易的标准折扣零售业务”。“

  

啊哈。它与 De 部分 部分中的 部分 相匹配。

  • 如果您只想匹配整个单词,请使用(\w+\W+){0,4}my_word(\W+\w+){0,4},这应该隔离分隔符和/或行结束之间的单词。
  • 如果您想匹配部门中的部分,请使用(^|(\w+\W+){1,5})\W*my_word\W*((\W+\w+){1,5}|$)