我使用了以下 RE 来过滤文本:
reg_ex=re.compile(r"\breal[?]*|\breally\s*[?]+", re.IGNORECASE)
和以下功能:
def is_present(text):
if reg_ex.search(text):
return True
else:
return False
该函数输出以下单词为真:
1)real
2)realization
3)this is not really true.
4)this is not real.
5)is this real?
6)really??????
7)really??!!!
8)really
但我不想让 RE 过滤这个词: 2)实现
确实如此
我应该如何更改我的 RE?
请您参考如下方法:
在提出解决方案之前,您必须分析自己的正则表达式。 \breal[?]*|\breally\s*[?]+ 包含 2 个备选方案,\breal[?]* 和 \breally\s*[ ?]+。 \breal[?]* 匹配一个单词边界(可能有一个非单词字符,或者当前位置之前的字符串的开头),然后是一个子字符串 real,然后是 0 个或多个 ? 符号。 \breally\s*[?]+ 匹配单词边界,really,0 个或更多空格和 1 或更多 ? symbols.It means, realization 会匹配,因为第一个选择完美匹配它(单词边界,real,后面有0个问号,第二个选择不是甚至尝试过)。
解决方案多种多样,但这里有一些提示:
1)(最符合原逻辑的)在real之后添加一个negative lookahead (?!ization): \breal(?!ization)[?]*|\breally\s*[?]+
2) (遵循逻辑......)你似乎允许任何以 real 开头的单词,使用 \breal(?!ization)
3) 如果你只是匹配 real 或 really 作为整个单词,你可以使用 \breal(?:ly)?\b .
