我正在尝试解析文本期刊,我只对文本的特定部分感兴趣。 我以为我做得很好,直到我注意到我无意中发现了部分。
假设我想匹配以下部分。
第7节 - 提供终端诊断
也可能显示为
第7节。提供终端诊断
但是如果单词在我的字符串之前或之下看到或者不在下面,我不想匹配任何内容。
参见第7节。提供终端诊断
或
根据第7节提交终端诊断
不应该匹配。
我尝试使用否定前瞻,但它只排除了这些词,它并没有抛弃整场比赛。
((?!see )Section[\s\\n]+7[\s+]+?[-:\\n\.]+?[\s+]+?(Delivering|Deliver)(.*terminal[\s+]+Diagnosis('s)?)?[\.]?)
我认为我没有正确地理解这种环顾概念。帮助
答案 0 :(得分:3)
否定前瞻表达的内容:指定一个在主表达式后无法与匹配的组。但是你之前没有任何东西。
使用负面的lookbehind:
(?<!see|under)
代替(?!see )
。
其他评论:你有一个大小写错误(终端应该是终端),如果你通过在r'my string'
之类的前面加上你的整个字符串“raw”,你就不需要双重转义字符了\n
。
答案 1 :(得分:1)
尝试以下方法..
无论您使用何种情况进行匹配,我都会在正则表达式前面使用r
。 r
是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