我使用以下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
该函数输出以下单词为true:
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?
答案 0 :(得分:3)
在提出解决方案之前,您必须分析自己的正则表达式。 \breal[?]*|\breally\s*[?]+
包含两个备选项\breal[?]*
和\breally\s*[?]+
。 \breal[?]*
匹配单词边界(可能有非单词char,或当前位置之前的字符串的开头),然后是子字符串real
,然后是0个或更多?
个符号。 \breally\s*[?]+
匹配字边界really
,0个或更多个空格以及 1 或更多?
个符号。这意味着,realization
将匹配,因为第一个替代方案完美匹配(单词边界,real
和0个问号之后,第二个替代方案甚至没有尝试过。)
解决方案是多方面的,但这里有一些提示:
1)(最符合原始逻辑的那个)在(?!ization)
之后添加否定前瞻real
:\breal(?!ization)[?]*|\breally\s*[?]+
2)(遵循逻辑......)您似乎允许以real
开头的任何字词,使用\breal(?!ization)
3)如果您只是将real
或really
作为整个词语进行匹配,则可以使用\breal(?:ly)?\b
。
答案 1 :(得分:2)
我会在两端使用单词边界,并使用一组词语:
这是怎么回事?
import re
r = re.compile(r"\b(real|really)\b",re.IGNORECASE)
for i in ["really ???", "is this real?","realization"]:
print(i,bool(r.search(i)))
输出
really ??? True
is this real? True
realization False
正则表达式甚至可以适应这样的单词列表:
r"\b({})\b".format("|".join(["real","really"]))