我试图解析文本日志,我只对文本的特定部分感兴趣。我认为我做的很好,直到我发现我无意中识别了部分。
假设我想匹配下面的部分。
第7节-交付终端诊断
它可能也会显示为
第7节.提供终端诊断
但我不想匹配任何东西,如果单词看到或下面在我的字符串前面,如下面。
见第7节.提供终端诊断
或
根据第7条提交。提供终端诊断
不应该与任何东西相匹配。
我试着用消极的眼光看,但它只排除了单词,它不会把整场比赛都扔出去。
((?!see )Section[\s\\n]+7[\s+]+?[-:\\n\.]+?[\s+]+?(Delivering|Deliver)(.*terminal[\s+]+Diagnosis('s)?)?[\.]?)
我不认为我是正确地把握了环视的概念。帮助?
发布于 2013-11-06 06:43:01
试试下面的..。
对于用于匹配的任何情况,我都会在正则表达式前面使用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
发布于 2013-11-06 04:49:32
消极展望:指定在主表达式之后不能匹配的组。但在这之前你什么都没有。
使用负后视:
(?<!see|under)
代替(?!see )
。
其他注释:您有一个大小写错误(终端应该是终端),如果您使用r(如r'my string'
)前缀使整个字符串"raw“,则不需要像\n
这样的双转义字符。
https://stackoverflow.com/questions/19804175
复制相似问题