我想根据正则表达式将一个字符串分成两组。该字符串基本上具有以下结构:
some text (data1 | data2 | data3 | data4)
我使用了一个简单的正则表达式如下:
re.match("^(?P<title>.*)\((?P<data>.*)\)$", s)
如果字符串中没有括号,它可以正常工作,否则会与正则表达式冲突。
但是如果其中一组中有括号,它会输出意想不到的结果:
>>> import re
>>> def process_string1(s):
... r = re.match("^(?P<title>.*?)\((?P<data>.*)\)$", s)
... return r.groups()
...
>>> def process_string2(s):
... r = re.match("^(?P<title>.*)\((?P<data>.*)\)$", s)
... return r.groups()
...
>>> s = "this is an example (detail) (data1 | data2 | data3 | data4)"
>>> print process_string1(s)
('this is an example ', 'detail) (data1 | data2 | data3 | data4') # Wrong
>>> print process_string2(s)
('this is an example (detail) ', 'data1 | data2 | data3 | data4') # Good
>>> s = "this is another example (data1 (detail) | data2 | data3 | data4)"
>>> print process_string1(s)
('this is another example ', 'data1 (detail) | data2 | data3 | data4') # Good
>>> print process_string2(s)
('this is another example (data1 ', 'detail) | data2 | data3 | data4') # Wrong
你能帮帮我吗?
请您参考如下方法:
查看这些答案:
简而言之,正则表达式不是像您那样用于匹配递归/嵌套结构的工具。您要求正则表达式匹配:
something (something (someting) something)
这是递归的,因为最里面的 something 可能再次成为 something (something) something。正则表达式不适合此工具,您应该使用 parser为了这。有关详细信息,请参阅以下问题:
