2010-06-11 73 views
0

我似乎無法創建正確的正則表達式從我的字符串中提取正確的標記。填充字符串的開頭使用一個空間中產生正確的輸出,但似乎不太理想:正則表達式來解析Python中的選項字符串

>>> import re 
>>> s = '-edge_0triggered a-b | -level_Sensitive c-d | a-b-c' 
>>> re.findall(r'\W(-[\w_]+)',' '+s) 
['-edge_0triggered', '-level_Sensitive'] # correct output 

這裏有一些正則表達式我試過的,沒有任何人有一個正則表達式的建議,不涉及改變原來的字符串,併產生正確的輸出

>>> re.findall(r'(-[\w_]+)',s) 
['-edge_0triggered', '-b', '-level_Sensitive', '-d', '-b', '-c'] 
>>> re.findall(r'\W(-[\w_]+)',s) 
['-level_Sensitive'] 

回答

1
r'(?:^|\W)(-\w+)' 

\w已經包含下劃線。

1

更改第一預選賽接受一個開始錨或不字,而不是僅僅一個不字:

>>> re.findall(r'(?:^|\W)(-[\w_]+)', s) 
['-edge_0triggered', '-level_Sensitive'] 

在組開始時,?:只是簡單地告訴正則表達式引擎不要將其視爲結果的組。

+0

非常感謝,馬克。你會得到支票,但我會用Ignacio的解決方案,因爲它更短。 – dlw 2010-06-11 01:35:33

+0

@dlw:你似乎對檢查的含義感到困惑。這並不意味着「這個答案是最快的答案」,這意味着「這就是我要使用的答案」。你應該檢查Ignacio的答案。 – tzot 2010-06-11 09:43:35

+0

對不起馬克,支票去伊格納西奧 – dlw 2010-08-26 01:20:27

0

你可以使用一個負回顧後:

re.findall(r'(?<!\w)(-\w+)', s) 

(?<!\w)部分的意思是「只有當沒有一個字字符前面的比賽」。

相關問題