得到错误的结果NLTK和REGEX

2024-10-02 18:27:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我要匹配所有包含 字母“a”、“e”、“i”、“o”和“u”中的每一个都有一次 顺序,这与语料库中的任何其他英语单词都不匹配。 到目前为止,我能够从语料库中得到所有a,e,i,o,u的单词,但是有些单词的元音出现了不止一次,例如我得到的结果是“abietineous”,而我只寻找像“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只能出现一次。(对不起,我的代码中有空格,但格式没有捕获我的星号*除非我放了空格)

谢谢


Tags: 代码inreforif顺序字母单词
2条回答

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

^[^aouie]*a[^aeoui]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$

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

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

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

请注意,由于您希望在循环中使用regex,因此最好在循环外编译regex,在循环中使用已编译的regex,而不是让python在每次迭代中编译regex。此外,由于regex将完全匹配单词,因此可以使用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']

相关问题 更多 >