2012-09-10 63 views
4

Python RegEx中的特殊序列(字符類)是類似\w\d的轉義字符,它與一組字符匹配。我可以在Python RegEx中混合使用字符類嗎?

在我的情況下,我需要能夠匹配除數字以外的所有字母數字字符。

也就是,\w減去\d

我需要使用特殊的序列\w因爲我處理非ASCII字符和需要匹配像「AE」和「O」的符號。

有人會認爲我可以使用這個表達式:[\w^\d]但它似乎不匹配任何東西,我不知道爲什麼。

因此,簡而言之,我如何在Python正則表達式中混合(加/減)特殊序列?


編輯:我不小心用[\W^\d]代替[\w^\d]。後者的確匹配了一些東西,包括圓括號和逗號,這些字母不是字母數字字符,就我而言。

+1

您的表情與alpha,數字和^相匹配,我認爲。對於'regex',否定類應該放在類定義 – njzk2

回答

12

您可以使用r"[^\W\d]",即。顛倒非字母數字和數字的聯合。

+3

請注意,您需要設置're.UNICODE'來匹配'æ'和其他非ASCII字符。 OP可能已經做到了這一點,但它有說明。 –

+0

在這種情況下,我該如何爲角色類添加特定的字符,例如:空格或逗號? – Hubro

+0

@Codemonkey您可以使用非捕獲組和'|':'(?:[^ \ W \ d] | [,])' –

5

你不能減去字符類,沒有。

最好的辦法是使用新的regex module,用python替換當前的re模塊。它支持基於Unicode屬性的字符類別:

\p{IsAlphabetic} 

這將匹配Unicode規範所指定的任何字符是字母字符。

更好,regex確實支持字符類減法;它認爲這樣的類的集合,並允許您創建具有--運營商的差異:

[\w--\d] 

匹配\w一切,除了任何也匹配\d

+1

+1的開頭,但實際上它支持類減法:'[\ w - \ d]' – georg

+0

@ thg435:酷,我剛剛找到那個也是。 :-) –

1

我不認爲你可以直接在一個正則表達式中組合(布爾和)字符集,無論是否否定。否則,您可以簡單地組合[^\d]\w

注意:^必須在集合的開始,並適用於整個集合。從文檔中:「如果集合的第一個字符是'^',那麼所有不在集合中的字符都將匹配。」 您的設置[\w^\d]會嘗試匹配一個字母數字字符,後跟一個插入符,後跟一個數字。我可以想象,這也不符合任何東西。

我會在兩個步驟中做到這一點,有效地結合正則表達式。非數字(內正則表達式)第一匹配,則通過字母數字字符匹配:

re.search('\w+', re.search('([^\d]+)', s).group(0)).group(0) 

或變化這一主題。

請注意,需要用try: except:塊來包圍它,因爲如果兩個正則表達式中的一個出現故障,它將拋出AttributeError: 'NoneType' object has no attribute 'group'。但是,當然,您可以將這一行分成幾行。

2

您可以使用否定性超前斷言(例如r'(?!\d)[\w]')來排除類別以匹配單詞字符,但不包括數字。例如:

>>> re.search(r'(?!\d)[\w]', '12bac') 
<_sre.SRE_Match object at 0xb7779218> 
>>> _.group(0) 
'b' 

要排除多個組,您可以使用通常的[...]語法先行斷言,例如r'(?![0-5])[\w]'將匹配除了數字0-5任何字母數字字符。

[...]一樣,上述構造匹配單個字符。要匹配多個字符,添加一個重複操作符:

>>> re.search(r'((?!\d)[\w])+', '12bac15') 
<_sre.SRE_Match object at 0x7f44cd2588a0> 
>>> _.group(0) 
'bac' 
+0

這隻適用於單字母組合;你必須將它分組到一個更大的組中才能工作。 –

+1

當然,但配對也是如此。我會更新答案以明確說明。 – user4815162342

相關問題