为什么以下否定前瞻不起作用

时间:2011-09-25 03:55:10

标签: python regex

import re
txt =  'harry potter is awsome  so is harry james potter'
pat = '\W+(?!potter)'
re.findall(pat,txt)

根据我的理解,输出应该是所有未被波特跟随的词

  

['potter','是','awsome','so','是','harry','james','potter']

但实际输出是

  <'哈利','波特','是','太棒了','所以','是','哈利','詹姆斯','波特']

为什么这种模式也与波特所遵​​循的哈利相匹配?

4 个答案:

答案 0 :(得分:4)

因为" potte""potter"不匹配。

>>> txt = 'harry potter is awsome  so is harry james potter'
>>> pat = '(\w+)(?:\W|\Z)(?!potter)'
>>> re.findall(pat,txt)
['potter', 'is', 'awsome', 'so', 'is', 'harry', 'potter']

答案 1 :(得分:3)

  

根据我的理解,输出应该是所有未被波特跟随的词语

确实如此。问题是,每个单词后面都没有potter,因为根据定义,每个单词后跟空格或字符串的结尾。

答案 2 :(得分:0)

import re

txt =  txt =  'harry potter is awsome  so is harry james potter'

pat = r'\w+\b(?![\ ]+potter)'

print re.findall(pat,txt)

答案 3 :(得分:0)

我得到了这个结果:

[' ', ' ', '  ', ' ', ' ', ' ']

......这正是我所期待的。 \W+(注意大写W)匹配一个或多个非单词字符,因此\W+(?!potter)匹配输入中单词之间的空格,除非即将出现的单词以“potter”开头。如果我想匹配每个没有跟着“波特”这个词的单词,我会使用这个正则表达式:

pat = r'\b\w+\b(?!\W+potter\b)'

\bword boundary匹配;前两个确保我匹配整个单词,最后一个确保即将到来的单词是“potter”而不是以“potter”开始的更长的单词。

注意我是如何使用原始字符串(r'...')的。你应该养成在Python中使用它们的所有正则表达式的习惯。在这种情况下,如果我使用普通字符串,\b将被解释为退格符。