1

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

假设我想匹配以下部分。

第 7 节 - 提供终末诊断

这也可能显示为

第 7 节 提供终末诊断

但是,如果单词 see 或 under 在我的字符串之前,我不想匹配任何内容,如下所示。

见第 7 节。提供终末诊断

或者

根据第 7 节提交。提供终末诊断

不应该匹配任何东西。

我尝试使用否定的前瞻,但它只排除单词,它不会抛出整个匹配。

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

我认为我没有正确掌握环视概念。帮助?

4

2 回答 2

3

负预测执行它所说的:指定一个在主表达式之后无法匹配的组。但在它之前你什么都没有。

使用负面回顾:

(?<!see|under)

代替(?!see ).

其他评论:你有一个大小写错误(终端应该是终端),如果你通过在它前面加上一个 r 来使你的整个字符串“原始”,r'my string'你不需要像\n.

于 2013-11-06T04:49:32.953 回答
2

试试下面的..

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

这是使用双重负后视的可能解决方案。

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

live demo


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

matches = re.findall(r"(?<!see)(?<!under)\s+(section 7[\s.:-]+(?:deliver(?:ing)?).*?terminal\s+diagnosis(?:'s)?)", s, re.I)
print matches
于 2013-11-06T06:43:01.540 回答