我正在用python学习正则表达式,但似乎无法掌握它。我正在尝试过滤掉包含英语中所有元音的所有单词,这是我的正则表达式:
df.to_csv(r"C:\Users\Eddie\Downloads\pandas\Deformation_new.txt", sep="\t", index=False)
似乎太模糊了,因为任何元音(甚至是重复的元音)都可以出现在任何地方,并且有任意数量的次数,因此这会抛出诸如“ actionable”,“不幸”之类的单词,这些单词的元音数确实为5,但不是所有元音。我环顾了互联网,发现了这个正则表达式:
r'\b(\S*[aeiou]){5}\b'
但是看起来,它仅用于元音的顺序出现,这比我要完成的任务要有限得多。有人可以在为我遇到的问题制作正则表达式时“大声思考”吗?
答案 0 :(得分:4)
如果您打算将单词匹配为仅由英文字母组成的文本块,则可以使用正则表达式,例如
\b(?=\w*?a)(?=\w*?e)(?=\w*?i)(?=\w*?o)(?=\w*?u)[a-zA-Z]+\b
请参见regex demo
要支持英语以外的其他语言,可以将[a-zA-Z]+
替换为[^\W\d_]+
。
如果您要匹配的“单词”是您可以使用的大量非空格字符,则
(?<!\S)(?=\S*?a)(?=\S*?e)(?=\S*?i)(?=\S*?o)(?=\S*?u)\S+
请参见this regex demo。
使用原始字符串文字在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)
-一系列正向超前行为,它们在检测到单词边界位置后立即触发,并且要求存在a
,e
,i
,{在任何0个以上的字符后,{1}}和o
(字母,数字,下划线-您可以将u
替换为\w*?
以仅检查字母)[^\W\d_]*?
-1个或多个ASCII字母(用[a-zA-Z]+
替换以匹配所有字母)[^\W\d_]+
-单词边界,此处为尾随单词边界第二种模式的详细信息:
\b
:
(?<!\S)(?=\S*?a)(?=\S*?e)(?=\S*?i)(?=\S*?o)(?=\S*?u)\S+
-字符串开头或空格之后的位置(?<!\S)
-所有英语元音必须以任意顺序出现-除空格以外的任何0+字符之后(?=\S*?a)(?=\S*?e)(?=\S*?i)(?=\S*?o)(?=\S*?u)
-1个以上非空格字符。 答案 1 :(得分:0)
我想不出一种简单的方法来使用单个正则表达式查找“带有所有元音的单词”,但可以通过将正则表达式分别与 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.")