可选组与任何内容都不匹配

时间:2012-03-04 19:38:24

标签: python regex

我使用以下正则表达式,但它不起作用

([^@]+)(?:_@(\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

你有什么想法来解决我的问题吗?

2 个答案:

答案 0 :(得分:3)

如果这是唯一的要求,正则表达式就是矫枉过正。怎么样呢:

>>> "variable_name_1".partition("_@")
('variable_name_1', '', '')
>>> "variable_name_2_@5".partition("_@")
('variable_name_2', '_@', '5')

答案 1 :(得分:0)

你的正则表达式正确匹配第一种字符串,但与第二种字符串不匹配。

删除正则表达式中的最后一个?会正确匹配第二种字符串,但不再正确匹配第一种字符串。

我认为原因是使正则表达式的第二部分可选,使第一部分过于贪婪。我不知道是否有一个修饰符可以使你的正则表达式工作,但两个正则表达式的组合将起作用:

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

你现在需要的只是对元组进行后处理以获得两个元素,其中第二个可能是None

或者,您可以手动尝试匹配第一个正则表达式,然后针对实用程序函数中的第二个正则表达式。