2012-03-04 73 views
0

我用下面的正則表達式,但它不工作可選組不匹配任何

([^@]+)(?:[email protected](\d+))? 

Variable_Name_1
實際:
\ 1 = Variable_Name_1
\ 2 = NULL

預計:

\1 = Variable_Name_1 
\2 = null 

Variable_Name_1_ @ 4
實際:

\1 = Variable_Name_1_ 
\2 = null 

預計:

\1 = Variable_Name_1 
\2 = 4 

你有一些想法,以解決我的問題?

+1

你給正則表達式提供什麼工具或編程語言/庫? – Irfy 2012-03-04 19:40:40

+1

另外,你可以用文字描述你想要匹配什麼嗎?你只是試圖用'_ @'開始可選?或者strig'_ @'本身是可選的? – Irfy 2012-03-04 19:42:20

+0

我使用Python,我有一個輸入字符串,我想匹配變量名稱和她的index.i'm試圖使_ @可選,並且我需要保存數字@(如果他存在) – Jeff 2012-03-04 19:48:46

回答

0

您的正則表達式正確地匹配第一種字符串,但不能正確匹配第二種字符串。

刪除正則表達式中的最後一個?與正確的第二種字符串匹配,但不再正確匹配第一種字符串。

我相信原因是使正則表達式的第二部分可選,使第一部分過於貪婪。我不知道是否有一個修改,這將使你的正則表達式的工作,但兩個正則表達式的組合將工作:

>>> re.search('(?:([^@]+)(?:[email protected](\d+))|([^@]+))', '[email protected]').groups() 
('Variable_Name_1', '4', None) 
>>> re.search('(?:([^@]+)(?:[email protected](\d+))|([^@]+))', 'Variable_Name_1').groups() 
(None, None, 'Variable_Name_1') 

你現在需要的是剛剛的過程後有兩個元素的元組其次可能是None

或者,您可以手動嘗試匹配第一個正則表達式,然後針對實用程序函數中的第二個正則表達式。

+0

正是!我需要使用另一個組。我認爲最好的方法是在Python中使用'partition'函數 – Jeff 2012-03-04 20:14:59