【问题标题】:Getting wrong results NLTK and REGEX得到错误的结果 NLTK 和 REGEX
【发布时间】:2017-06-06 04:39:52
【问题描述】:

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

这是我的代码的 sn-p。请协助修复我的 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 只能出现一次。 (对不起,我的代码中的空格,但格式没有捕获我的星号 * 除非我放了一个空格)

谢谢

【问题讨论】:

  • 那是因为. 匹配任何字符。
  • 但方括号 [] 不是将其限制为 1 个字符吗?
  • .*无关,匹配任意字符的任意组合。

标签: python regex nlp


【解决方案1】:

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

^[^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)]

请注意,由于您想在循环中使用正则表达式,因此最好将正则表达式编译出循环并在循环中使用已编译的正则表达式,而不是让 python 在每次迭代时编译正则表达式。此外,由于正则表达式将完全匹配单词,因此您可以使用 re.match 而不是搜索。

【讨论】:

  • 演示中的Regex和这里的不一样?
  • @MYGz 哎呀,是的,我想我正要在保存之前测试你的正则表达式;)
  • @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 感谢您的注意,我不知道这一点。但是由于我们不确定确切的行为,最好在这种情况下编译正则表达式。
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2020-03-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多