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

据我所知,所出的,应当是波特所没有跟从的一切话
[波特','是','恶','所以','是','哈利','詹姆斯','波特']
但实际产出是
“,”哈利“,”波特“,”is“,”awsome“,”so“,”is“,”哈利“,”詹姆斯“,”波特“]
为什么模式也符合哈利波特所遵循的?

最佳答案

我得到这个结果:

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

……这正是我所期望的\W+(注意大写字母W)匹配一个或多个非单词字符,因此\W+(?!potter)匹配输入中单词之间的空白,除非即将出现的单词以“potter”开头如果我想匹配每个不跟“potter”一词的单词,我会使用这个regex:
pat = r'\b\w+\b(?!\W+potter\b)'

\b匹配aword boundary;前两个确保我匹配的是整个单词,最后一个确保即将出现的单词是“potter”,而不是以“potter”开头的较长单词。
注意我如何使用原始字符串(r'...')。您应该养成在Python中对所有regex使用它们的习惯在这种情况下,如果我使用了普通字符串,\b将被解释为退格字符。

关于python - 为什么以下否定前瞻不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7543541/

10-09 17:14