Python 得到错误的结果NLTK和REGEX

Python 得到错误的结果NLTK和REGEX,python,regex,nlp,Python,Regex,Nlp,我想匹配所有包含 每个字母‘a’、‘e’、‘i’、‘o’和‘u’都只对应一次 顺序,这与单词库中的任何其他英语单词都不匹配。 到目前为止,我能够从语料库中获得所有a、e、i、o、u的单词,但有些单词的元音出现了不止一次,例如,我得到的结果是“Abeetinous”,而我只寻找像“abstemious”这样的单词 下面是我的代码片段。请协助修复我的RE以获得这些结果 [w for w in wordlist if re.search('[a].* [e].* [i].* [o].* [u].',

我想匹配所有包含 每个字母‘a’、‘e’、‘i’、‘o’和‘u’都只对应一次 顺序,这与单词库中的任何其他英语单词都不匹配。 到目前为止,我能够从语料库中获得所有a、e、i、o、u的单词,但有些单词的元音出现了不止一次,例如,我得到的结果是“Abeetinous”,而我只寻找像“abstemious”这样的单词

下面是我的代码片段。请协助修复我的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必须只出现一次。(很抱歉,我的代码中有空格,但格式没有捕获我的星号*,除非我放了空格)


感谢您的正则表达式匹配意外单词的原因,因为
修饰符匹配任何字符。如果你想摆脱它,你需要限制字符之间的特殊的。在这种情况下,您需要使用一个否定字符类,该类将匹配除元音之外的任何内容

^[^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)]
请注意,由于您希望在循环中使用正则表达式,因此最好在循环外编译正则表达式,并在循环中使用已编译的正则表达式,而不是让python在每次迭代中编译正则表达式。此外,由于正则表达式将完全匹配单词,您可以使用
re.match
而不是搜索。

尝试以下方法:

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']

这是因为
匹配任何字符。但方括号[]是否将其限制为1个字符?它与
*
无关,后者匹配任何字符的任何组合。演示中的Regex和这里的不一样?@MYGz oops,是的,我想在保存之前要测试您的Regex;)@MYGz和Kasramvd多亏了你们两位,我才能够使用以下代码获得它:[w for w in wordlist if re.search(r'^[^aouie]*a[^aeoui]*e[^aeiou]*I[^aeiou]*o[^aeiou]*u[^aeiou]*$,w)]…我正在按照我们大学的要求使用juypter notebook for python和nltk,所以在导入等之后,执行该代码会得到预期的结果。@Kasramvd正则表达式由re模块缓存。如果您只有少量的模式,将不会重新编译。@lenz谢谢您的提示,我没有意识到这一点。但由于我们不能确定确切的行为,因此最好在这种情况下编译正则表达式。