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

发布于 2025-01-11 08:55:39 字数 515 浏览 0 评论 0原文

我在 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))']

感谢任何帮助。

I have a string like this in 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)

Actual result is:

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

Expected result is:

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

Any help is appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

〆凄凉。 2025-01-18 08:55:39

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
    )
)

The OP's issue was already solved by using the regex module though, I'd like to introduce pyparsing as an alternative solution here. It can be installed by the following command:

pip install pyparsing

Code:

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))']

Explanation:

The key point is the expr in the above code. I added some explanatory comments to its definition as follows:

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
    )
)
给我一枪 2025-01-18 08:55:39

使用 PyPi 正则表达式模块,您可以使用类似

import regex
s = "eq(Firstname,test),eq(Lastname,ltest),OR(eq(ContactID,12345),eq(ContactID,123456))"
for x in regex.split(r"(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,", s):
    if x is not None:
        print( x )

输出的代码:

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

请参阅Python正则表达式演示

详细信息

  • (\((?:[^()]++|(?1))*\)) - 第 1 组捕获嵌套配对括号之间的字符串
  • < code>(*SKIP)(*F) - 跳过匹配并从失败位置搜索下一个匹配
  • | - 或
  • , - a逗号。

With PyPi regex module, you can use the code like

import regex
s = "eq(Firstname,test),eq(Lastname,ltest),OR(eq(ContactID,12345),eq(ContactID,123456))"
for x in regex.split(r"(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,", s):
    if x is not None:
        print( x )

Output:

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

See the Python and the regex demo.

Details:

  • (\((?:[^()]++|(?1))*\)) - Group 1 capturing a string between nested paired parentheses
  • (*SKIP)(*F) - the match is skipped and the next match is searched for from the failure position
  • | - or
  • , - a comma.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文