Skip to main content
 首页 » 编程设计

python之由于用户输入导致的正则表达式冲突

2024年10月25日34虾米哥

我想根据正则表达式将一个字符串分成两组。该字符串基本上具有以下结构:

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为了这。有关详细信息,请参阅以下问题: