2014-09-01 44 views
1

我想要一個正則表達式,它將返回列表中僅包含輔音且不包含特殊字符的所有單詞。正則表達式:如何一次過濾兩件事

下面的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]。

回答

1

您可以使用look-around assertion將它們結合起來:

import re 
input = ["xkcd", "word", "xml-"] 
output = [i for i in input if re.match(r'(?=^[^aeiou]+$)^[a-z]+$', i)] 
1

你可以只寫在括號內的21個輔音:

[bcd...xyz]+ 
2

嗯,你知道所有的輔音事先:

>>> import re 
>>> words = ["xkcd", "word", "xml-"] 
>>> pattern = re.compile(r'^[bcdfghjklmnpqrstvwxyz]+$') 
>>> [word for word in words if pattern.match(word)] 
['xkcd'] 
+0

使用'[^ ​​aeiou]'檢查元音的缺失不是更容易嗎? – 2014-09-01 04:15:19

+1

@JayanthKoushik在這種情況下,可能會有其他字符,如'xml-'字符串 - 正如OP所說的那樣不匹配。如果你想用否定的斷言 - 你可能會發現@ kev的答案是正確的。 – alecxe 2014-09-01 04:20:03

+0

這種方式更好,因爲它只需要解析字符串一次,並且模式在第一個禁止字符時會失敗。 – 2014-09-01 05:18:37

1

如何這樣做只有輔音的正則表達式搜索?像這樣的東西應該工作:

import re 

words = ["xkcd", "word", "xml-"] 
consonants_only = [x for x in words if re.search("^[bcdfghjklmnpqrstvwxyz]+$", x)] 

print consonants_only 

這樣也會更有效率。

0

通過式斷言,

>>> import re 
>>> words = ["xkcd", "word", "xml-"] 
>>> pattern = re.compile(r'^(?:(?![aeiou])[a-z])+$') 
>>> [word for word in words if pattern.match(word)] 
['xkcd'] 
1

另一種解決方案,利用正向前查找和搜索,而不是使用匹配方法。

>>> import re 
>>> words = ['xkcd', 'word', 'xml-'] 
>>> [x for x in words if re.match(r'(?=[a-z]+$)[^aeiou]+$', x)] 
['xkcd'] 
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))