正则表达式:如何一次过滤两件事

时间:2014-09-01 04:07:05

标签: python regex

我想要一个正则表达式,它将返回列表中仅包含辅音且没有特殊字符的所有单词。

以下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]的一般方法。

7 个答案:

答案 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))