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']
但实际输出是
<'哈利','波特','是','太棒了','所以','是','哈利','詹姆斯','波特']
为什么这种模式也与波特所遵循的哈利相匹配?
答案 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)'
\b
与word boundary匹配;前两个确保我匹配整个单词,最后一个确保即将到来的单词是“potter”而不是以“potter”开始的更长的单词。
注意我是如何使用原始字符串(r'...'
)的。你应该养成在Python中使用它们的所有正则表达式的习惯。在这种情况下,如果我使用普通字符串,\b
将被解释为退格符。