繁体   English   中英

匹配包含所有元音的单词的正则表达式是什么?

[英]What is the regex to match the words containing all the vowels?

我正在 python 中学习正则表达式,但似乎无法掌握它。 我正在尝试过滤掉所有包含英语元音的单词,这是我的正则表达式:

r'\b(\S*[aeiou]){5}\b'

似乎它太模糊了,因为任何元音(甚至是重复的)都可以出现在任何地方,并且任何数字都是次数,所以这是抛出诸如“可操作”、“不幸”之类的词,它们确实将元音计数为 5,但不是所有元音. 我环顾了互联网,发现了这个正则表达式:

r'[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*

但看起来,它只是为了元音的顺序出现,比我想要完成的任务非常有限。 有人可以在为我遇到的问题制作正则表达式时“大声思考”吗?

如果您打算将单词匹配为仅由英文字母组成的文本块,您可以使用正则表达式,例如

\b(?=\w*?a)(?=\w*?e)(?=\w*?i)(?=\w*?o)(?=\w*?u)[a-zA-Z]+\b

查看正则表达式演示

要支持英语以外的语言,您可以将[a-zA-Z]+替换为[^\\W\\d_]+

如果您要匹配的“单词”是一大块非空白字符,您可以使用

(?<!\S)(?=\S*?a)(?=\S*?e)(?=\S*?i)(?=\S*?o)(?=\S*?u)\S+

请参阅此正则表达式演示

使用原始字符串文字在 Python 中定义这些模式,例如:

rx_AllVowelWords = r'\b(?=\w*?a)(?=\w*?e)(?=\w*?i)(?=\w*?o)(?=\w*?u)[a-zA-Z]+\b'

细节

  • \\b(?=\\w*?a)(?=\\w*?e)(?=\\w*?i)(?=\\w*?o)(?=\\w*?u)[a-zA-Z]+\\b :
    • \\b - 一个词边界,这里是一个起始词边界
    • (?=\\w*?a)(?=\\w*?e)(?=\\w*?i)(?=\\w*?o)(?=\\w*?u) - 一个正数序列那些字检测边界位置后立即触发,并要求存在向前看符号aeiou后的任何0+字字符(字母,数字,下划线-你可以取代\\w*?[^\\W\\d_]*?仅检查字母)
    • [a-zA-Z]+ - 1 个或多个 ASCII 字母(替换为[^\\W\\d_]+以匹配所有字母)
    • \\b - 一个词边界,这里是一个尾随词边界

第二个图案细节:

  • (?<!\\S)(?=\\S*?a)(?=\\S*?e)(?=\\S*?i)(?=\\S*?o)(?=\\S*?u)\\S+ :
    • (?<!\\S) - 字符串开头或空格之后的位置
    • (?=\\S*?a)(?=\\S*?e)(?=\\S*?i)(?=\\S*?o)(?=\\S*?u) - 所有英语元音必须出现 - 以任何顺序 - 在除空格之外的任何 0+ 个字符之后
    • \\S+ - 1+ 个非空白字符。

我想不出一种简单的方法来使用单个正则表达式查找“​​带有所有元音的单词”,但是可以通过将正则表达式分别与 a、e、i、o 和 u 结合在一起来轻松完成。 例如,像下面这样的 Python 脚本应该确定给定的英语单词是否包含所有元音(以任何顺序,任何多重性):

#! /usr/bin/python3
# all-vowels.py
import sys
import re
if len(sys.argv) != 2: sys.exit()
word=sys.argv[1]
if re.search(r'a', word) and re.search(r'e', word) and re.search(r'i', word) and re.search(r'o', word) and re.search(r'u', word):
   print("Word has all vowels!")
else:
   print("Word does NOT have all vowels.")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM