在python中,逗号分隔字符串不在圆括号或花括号中

2024-10-04 09:32:13 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我要用逗号分隔的字符串。在

如果()或{}中有逗号,则不应拆分该字符串。在

我使用以下代码拆分:

现在它只处理(),我如何包括{}?在

import re
s = "Water,^.*f04.*&~(.*z.,*)$,Iron Oxides (CI 77491, 77492),a{3,4}"
print re.split(r',\s*(?![^()]*\))', s)

输出应为:

^{pr2}$

Tags: 字符串代码importrecisplitprint逗号
2条回答

使用允许可变长度查找的regex模块:

regex.split(r'(?<![({][^,]*),(?![^,]*[})])', str_)
  • (?<![({][^,]*)是一个零宽度的负查找,它确保,前面没有(或{},并且中间没有{}

  • ,匹配文本,

  • (?![^,]*[})])是一个零宽度的负前瞻,它确保,后面不跟任何中间的,后跟{}或{}

示例:

^{pr2}$

限制:

  • [({]匹配(/{,而{}匹配)/}中的任何一个,因此,当子串以(开头,以}结尾或相反的方式

  • 不适用于嵌套括号/方括号

假设你的方括号可以嵌套,你所拥有的并不是一种常规语言。虽然re确实有很多扩展,使它能够处理实际正则表达式之外的事情,但最好使用一个简单的括号计数解析器来处理这一问题。在

如下所示(未经测试,但应足够简单,以便理解和调试):

bracketmap = {'(': ')', '[': ']', '{': '}'}

def splitify(s):
    stack = []
    lastcomma = 0
    for i, c in enumerate(s):
        if not stack and c == ',':
            yield s[lastcomma:i]
            lastcomma = i+1
        elif c in bracketmap:
            stack.append(bracketmap[c])
        elif c in ')]}':
            if stack.pop() != c:
                raise ValueError('unbalanced brackets')
    if stack:
        raise ValueError('unbalanced brackets')
    if lastcomma <= len(s):
        yield s[lastcomma:]

在一篇评论中,当被问及你的方括号是否可以嵌套时,你说:

it can be if it appears to be a valid regex.

因此,如果字符串实际上是一个regex模式,那么您需要做的不仅仅是排除括号内的逗号。例如,\{,\}不是大括号内用于计数的逗号,而是一个完全正常的文字逗号。在

编写一个完整的regex解析器显然比仅仅计算括号对要复杂一些(尽管如果您想要的是Pythonre语法,您可以使用该库编译它,然后使用库的调试工具来扫描文本paren,而不是自己编写,但也许你可以通过计算未经扫描的括号对来逃脱惩罚?在

^{pr2}$

(我假设你不想把\,当作一个字面上的逗号。如果你这么做了,那只是一个微不足道的改变。)

相关问题 更多 >