python - 正则表达式用括号外的逗号分割字符串,并具有多个级别的python

标签 python regex string

我在 python 中有一个这样的字符串

filter="eq(Firstname,test),eq(Lastname,ltest),OR(eq(ContactID,12345),eq(ContactID,123456))"
    rx_comma = re.compile(r"(?:[^,(]|\([^)]*\))+")
    result = rx_comma.findall(filter)

实际结果是:

['eq(Firstname,test)', 'eq(Lastname,ltest)', 'OR(eq(ContactID,12345)', 'eq(ContactID,123456))']

预期结果是:

['eq(Firstname,test)', 'eq(Lastname,ltest)', 'OR(eq(ContactID,12345),eq(ContactID,123456))']

感谢任何帮助。

最佳答案

虽然OP的问题已经通过使用regex模块得到解决,但我想在这里介绍pyparsing作为替代解决方案。可以通过以下命令安装:

pip install pyparsing

代码:

import pyparsing as pp
s = "eq(Firstname,test),eq(Lastname,ltest),OR(eq(ContactID,12345),eq(ContactID,123456))"
expr = pp.delimited_list(pp.original_text_for(pp.Regex(r'.*?(?=\()') + pp.nested_expr('(', ')')))
output = expr.parse_string(s).as_list()
assert output == ['eq(Firstname,test)', 'eq(Lastname,ltest)', 'OR(eq(ContactID,12345),eq(ContactID,123456))']

说明:

关键点是上面代码中的expr。我在其定义中添加了一些解释性注释,如下:

pp.delimited_list( # Separate a given string at the default comma delimiter
    pp.original_text_for( # Get original text instead of completely parsed elements.
        pp.Regex(r'.*?(?=\()') # Search everything before the first opening parenthesis '('
        + pp.nested_expr('(', ')') # Parse nested parentheses
    )
)

关于python - 正则表达式用括号外的逗号分割字符串,并具有多个级别的python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71341796/

相关文章:

string - 构造倒排索引列表的复杂性

c - 字符串序列分析器

python - 堆叠标题,而不是两列

python - 附加到 Django 中的对象

python - 如果我永远同时运行两个或多个函数,它们是否访问相同的内存?

java - 正则表达式的优化

java - 将 Baillie–PSW 测试从 Python 转换为 Java

Java正则表达式热匹配元标签内容属性值

python - 使用正则表达式捕获文本,直到第一次出现新行

java - 我有一个包含多个 JSON 对象的数据字符串,如何将字符串中的所有 JSON 对象存储在填充对象的数组中?