设计RE来过滤单词

时间:2017-09-18 11:38:25

标签: python regex

我使用以下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?

2 个答案:

答案 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)如果您只是将realreally作为整个词语进行匹配,则可以使用\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"]))