我想要一个正则表达式,它将返回列表中仅包含辅音且没有特殊字符的所有单词。
以下Python代码有效:
import re
words = ["xkcd", "word", "xml-"]
consonants_only = [x for x in words
if (re.search("^[^aeiou]+$", x)
and re.search("^[a-z]+$", x))]
print consonants_only
这准确地返回['xkcd']
我的问题是:这可以用一个正则表达式很好地完成吗?我正在寻找的是同时过滤[^ aeiou]和[a-z]的一般方法。
答案 0 :(得分:2)
嗯,事先你知道所有的辅音:
>>> import re
>>> words = ["xkcd", "word", "xml-"]
>>> pattern = re.compile(r'^[bcdfghjklmnpqrstvwxyz]+$')
>>> [word for word in words if pattern.match(word)]
['xkcd']
答案 1 :(得分:1)
你可以在括号之间写下21个辅音:
[bcd...xyz]+
答案 2 :(得分:1)
如何只对辅音进行正则表达式搜索?这样的事情应该有效:
import re
words = ["xkcd", "word", "xml-"]
consonants_only = [x for x in words if re.search("^[bcdfghjklmnpqrstvwxyz]+$", x)]
print consonants_only
这也会更有效率。
答案 3 :(得分:1)
您可以使用look-around assertion
组合它们:
import re
input = ["xkcd", "word", "xml-"]
output = [i for i in input if re.match(r'(?=^[^aeiou]+$)^[a-z]+$', i)]
答案 4 :(得分:1)
另一种解决方案,使用正向前瞻而不是搜索使用匹配方法。
>>> import re
>>> words = ['xkcd', 'word', 'xml-']
>>> [x for x in words if re.match(r'(?=[a-z]+$)[^aeiou]+$', x)]
['xkcd']
答案 5 :(得分:0)
通过否定先行断言,
>>> import re
>>> words = ["xkcd", "word", "xml-"]
>>> pattern = re.compile(r'^(?:(?![aeiou])[a-z])+$')
>>> [word for word in words if pattern.match(word)]
['xkcd']
答案 6 :(得分:0)
我想最好创建一个可重用的函数,这样你就可以使用它来检查所有的变量。
def consOrvows(words):
vowels = []
cons = []
for word in words:
if re.match(r'[aeiou]',word):
vowels.append(word)
elif re.match(r'[bcdfghjklmnpqrstvwxyz]',word):
cons.append(word)
return vowels,cons
list(map(consOrvows,words))