Python正则表达式测试句子是有效的

时间:2015-12-31 08:19:04

标签: python regex compiler-construction

ACTIVE_LIST = ACTOR | ACTIVE_LIST and ACTOR
ACTOR = NOUN | ARTICLE NOUN
ARTICLE = a | the
NOUN = tom | jerry | goofy | mickey | jimmy | dog | cat | mouse

通过应用上述规则,我可以生成

a tom 
tom and a jerry 
the tom and a jerry 
the tom and a jerry and tom and dog

但不是

Tom 
the Tom and me

我可以通过仅使用python re模块检查句子是否正确。我知道如何通过[abc]匹配某些字符但不知道单词。 实际上我正试图解决这个ACM problem。如果有人帮助我,我可以做其余的事。 这是我在这个舞台上的第一个问题。任何建议或改进高度赞赏。

4 个答案:

答案 0 :(得分:2)

使用re.compile

re.compile('tom', re.IGNORECASE)

在下面的主题中,如果没有re.compile,您将有其他方法。 (搜索/匹配)

Case insensitive Python regular expression without re.compile

答案 1 :(得分:1)

这可以被视为NLP(自然语言处理)问题。有一个名为NLTK(自然语言工具包)的特殊python模块,可以最好地用于解决此任务,比使用正则表达式更容易完成。

1)首先,您需要下载NLTK(http://www.nltk.org/install.html

2)导入NLTK:

import nltk

3)创建一个小语法,一个包含四个规则(https://en.wikipedia.org/wiki/Context-free_grammar)的无上下文语法。通过NLTK的CFG模块,您可以使用一行代码轻松完成:

acm_grammar = nltk.CFG.fromstring("""
ACTIVE_LIST -> ACTOR | ACTIVE_LIST 'and' ACTOR
ACTOR -> NOUN | ARTICLE NOUN
ARTICLE -> 'a' | 'the'
NOUN -> 'tom' | 'jerry' | 'goofy' | 'mickey' | 'jimmy' | 'dog' | 'cat' | 'mouse' """)

4)创建一个将使用acm_grammar的解析器:

parser = nltk.ChartParser(acm_grammar)

5)在某些输入上测试它。输入句子必须采用逗号分隔的单词(字符串)的列表形式。 split()方法可用于此:

input= ["a tom", "tom and a jerry", "the tom and a jerry","the tom and a jerry and tom and dog","Tom", "the Tom and me"]

for sent in input:
    split_sent = sent.split()
    try:
        parser.parse(split_sent)
        print(sent,"-- YES I WILL")
    except ValueError:
        print(sent,"-- NO I WON'T")

在最后一步中,我们检查解析器是否可以根据acm_grammar解析句子。如果不能,则对解析器的调用将导致ValueError。 以下是此代码的输出:

a tom -- YES I WILL
tom and a jerry -- YES I WILL
the tom and a jerry -- YES I WILL
the tom and a jerry and tom and dog -- YES I WILL
Tom -- NO I WON'T
the Tom and me -- NO I WON'T

答案 2 :(得分:1)

是的,您可以将其写为正则表达式模式,因为语法是常规的。正则表达式会很长,但它可以以相当直接的方式生成;一旦你有正则表达式,你只需编译它并将其应用于每个输入。

关键是将常规规则变为重复。例如,

STATEMENT = ACTION | STATEMENT , ACTION

可以变成

ACTION (, ACTION)*

当然,这只是问题的一部分,因为您首先必须将ACTION转换为正则表达式才能为STATEMENT创建正则表达式

问题描述掩盖了一个重要问题,即输入不只是由小写字母字符和逗号组成。它还包含空格,正则表达式需要在适当的点上坚持空格。例如,上面的,可能必须(当然可能)后跟一个(或多个)空格。如果它前面还有一个或多个空格也许没问题;问题描述不清楚。

因此,NOUN的更正正则表达式实际上将变为:

((a|the) +)?(tom|jerry|goofy|mickey|jimmy|dog|cat|mouse)

(我也觉得有趣的是,所呈现的语法让VERB匹配" hatesssssssss"。我不知道这是否是故意的。)

答案 3 :(得分:0)

经过多次思考后,我已经解决了这个问题

ARTICLE = ( 'a', 'the')
NOUN = ('tom' , 'jerry' , 'goofy' , 'mickey' , 'jimmy' , 'dog' , 'cat' , 'mouse')

all_a = NOUN +tuple([' '.join([x,y]) for x in ARTICLE for y in NOUN])


def aseKi(str):
    return str in all_a

st = 'the tom and jerry'
st1 = 'tom and a jerry'

st2 = 'tom and jerry and the mouse'

st = 'tom and goofy and goofy and the goofy and a dog and cat'

val = st.split('and')

nice_val = [x.strip() for x in val]


s = [aseKi(x) for x in nice_val]

if all(s):
    print 'YES I WILL'
else:
    print "NO I WON'T"