2012-03-04 31 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