我使用以下正则表达式,但它不起作用
([^@]+)(?:_@(\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
你有什么想法来解决我的问题吗?
答案 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
。
或者,您可以手动尝试匹配第一个正则表达式,然后针对实用程序函数中的第二个正则表达式。