错误的结果NLTK和REGEX

时间:2017-01-21 06:25:53

标签: python regex nlp

我希望匹配包含的所有英语单词 每个字母'a','e','i','o'和'u'恰好一次在那里 顺序,这与语料库中的任何其他英语单词都不匹配。 到目前为止,我能够从语料库中获得所有a,e,i,o,u的单词,但有些单词的元音出现不止一次,例如我得到的结果如“abietineous”和“#39 ;而我只寻找像节制的那样的话。

以下是我的代码片段。请协助修复我的RE以获得这些结果。

[w for w in wordlist if re.search('[a].* [e].* [i].* [o].* [u].', w)]

注意:我希望单词只包含a,e,i,o,u - 按顺序,a,e,i,o,u只能出现一次。 (对不起我的代码中的空格,但格式是没有捕捉我的星号*除非我放一个空格)

由于

2 个答案:

答案 0 :(得分:3)

正则表达式匹配意外单词的原因是^[^aouie]*a[^aeoui]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$ 修饰符与任何字符匹配。如果你想摆脱它,你需要限制特殊之间的字符。在这种情况下,您需要使用一个否定的字符类,它将匹配除元音之外的任何内容。

regex = re.compile(r'[^aouie]*a[^aeoui]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*')
[w for w in wordlist if regex.match(w)]

演示:https://regex101.com/r/Wp2I6H/2

所以现在你可以找到预期的词:

re.match

请注意,由于您希望在循环中使用正则表达式,因此最好将正则表达式编译出循环并在循环中使用已编译的正则表达式,而不是让python在每次迭代时编译正则表达式。此外,由于正则表达式将完全匹配单词,因此您可以使用 items=new string[]{""}; items[size] = name; 代替搜索。

答案 1 :(得分:1)

试试这个:

import re
wordlist = ['education', 'abstemious', 'automobile', 'facetious', 'regulation', 'novowel', 'afacetiousman', 'aeiou', 'aaeioou', 'aieou']
vowels = ['a','e','i','o','u']
novowel = '[^'+''.join(vowels)+']*'
pattern = ''.join([novowel + v + '{1}' for v in vowels]) + novowel + '$'
print pattern
#[^aeiou]*a{1}[^aeiou]*e{1}[^aeiou]*i{1}[^aeiou]*o{1}[^aeiou]*u{1}[^aeiou]*$    
prog = re.compile(pattern)
print list(filter(lambda w: prog.match(w), wordlist))
# ['abstemious', 'facetious', 'aeiou']