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。如果有人帮助我,我可以做其余的事。 这是我在这个舞台上的第一个问题。任何建议或改进高度赞赏。
答案 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"