我正在 python 中学习正则表达式,但似乎无法掌握它。我正在尝试过滤掉所有包含英语元音的单词,这是我的正则表达式:
r'\b(\S*[aeiou]){5}\b'
Run Code Online (Sandbox Code Playgroud)
似乎它太模糊了,因为任何元音(甚至是重复的)都可以出现在任何地方,并且任何数字都是次数,所以这是抛出诸如“可操作”、“不幸”之类的词,它们确实将元音计数为 5,但不是所有元音. 我环顾了互联网,发现了这个正则表达式:
r'[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*
Run Code Online (Sandbox Code Playgroud)
但看起来,它只是为了元音的顺序出现,比我试图完成的任务非常有限。有人可以在为我遇到的问题制作正则表达式时“大声思考”吗?
如果您打算将单词匹配为仅由英文字母组成的文本块,您可以使用正则表达式,例如
\b(?=\w*?a)(?=\w*?e)(?=\w*?i)(?=\w*?o)(?=\w*?u)[a-zA-Z]+\b
Run Code Online (Sandbox Code Playgroud)
查看正则表达式演示
要支持英语以外的语言,您可以替换[a-zA-Z]+为[^\W\d_]+.
如果您要匹配的“单词”是一大块非空白字符,您可以使用
(?<!\S)(?=\S*?a)(?=\S*?e)(?=\S*?i)(?=\S*?o)(?=\S*?u)\S+
Run Code Online (Sandbox Code Playgroud)
请参阅此正则表达式演示。
使用原始字符串文字在 Python 中定义这些模式,例如:
rx_AllVowelWords = r'\b(?=\w*?a)(?=\w*?e)(?=\w*?i)(?=\w*?o)(?=\w*?u)[a-zA-Z]+\b'
Run Code Online (Sandbox Code Playgroud)
细节
\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,e,i,o和u任何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+ 个非空白字符。