否定前瞻 - 如果找到单词,则排除整个匹配?

时间:2013-11-06 04:33:29

标签: python regex python-2.7 regex-lookarounds

我正在尝试解析文本期刊,我只对文本的特定部分感兴趣。 我以为我做得很好,直到我注意到我无意中发现了部分。

假设我想匹配以下部分。

  

第7节 - 提供终端诊断

也可能显示为

  

第7节。提供终端诊断

但是如果单词在我的字符串之前或之下看到或者不在下面,我不想匹配任何内容。

  

参见第7节。提供终端诊断

  

根据第7节提交终端诊断

不应该匹配。

我尝试使用否定前瞻,但它只排除了这些词,它并没有抛弃整场比赛。

((?!see )Section[\s\\n]+7[\s+]+?[-:\\n\.]+?[\s+]+?(Delivering|Deliver)(.*terminal[\s+]+Diagnosis('s)?)?[\.]?)

我认为我没有正确地理解这种环顾概念。帮助

2 个答案:

答案 0 :(得分:3)

否定前瞻表达的内容:指定一个在主表达式后无法与匹配的组。但是你之前没有任何东西。

使用负面的lookbehind:

(?<!see|under)

代替(?!see )

其他评论:你有一个大小写错误(终端应该是终端),如果你通过在r'my string'之类的前面加上你的整个字符串“raw”,你就不需要双重转义字符了\n

答案 1 :(得分:1)

尝试以下方法..

无论您使用何种情况进行匹配,我都会在正则表达式前面使用rr是Python的正则表达式模式的原始字符串表示法,为了避免转义,并且为了避免查找大写或小写的事实,请使用re.I进行不区分大小写的匹配。

这是使用双重负面观察的可能解决方案。

(?<!see)(?<!under)\s+(section 7[\s.:-]+(?:deliver(?:ing)?).*?terminal\s+diagnosis(?:'s)?)

请参阅live demo


通过使用原始字符串表示法和re.I的示例,这就是我的意思。

matches = re.findall(r"(?<!see)(?<!under)\s+(section 7[\s.:-]+(?:deliver(?:ing)?).*?terminal\s+diagnosis(?:'s)?)", s, re.I)
print matches