regex 如果逗号不在方括号之间,则按逗号分隔,同时允许字符位于方括号之外,并处于相同的逗号分隔中

uqdfh47h  于 2023-03-09  发布在  其他
关注(0)|答案(4)|浏览(117)

我有一个python脚本。它使用了一些正则表达式。我想拆分字符串s,但是逗号,同时忽略括号内的任何逗号。

s = """aa,bb,(cc,dd),m(ee,ff)"""
splits = re.split(r'\s*(\([^)]*\)|[^,]+)', s, re.M|re.S)
print('\n'.join(splits))
Actual output:
    aa
    ,
    bb
    ,
    (cc,dd)
    ,
    m(ee
    ,
    ff)
Desired output: 
    aa
    bb
    (cc,dd)
    m(ee,ff)

所以我不能让它处理括号外的文本。希望有人能帮我。

js5cn81o

js5cn81o1#

您可以使用此正则表达式进行拆分:

>>> s = """aa,bb,(cc,dd),m(ee,ff)"""
>>> print ( re.split(r',(?![^()]*\))', s) )
['aa', 'bb', '(cc,dd)', 'm(ee,ff)']

RegEx Demo

    • RegEx详细信息:**
  • ,:匹配逗号
  • (?![^()]*\)):一个否定的前瞻Assert,通过Assert在0个或多个非括号字符之后没有),确保我们不匹配(...)中的逗号。
xvw2m8pv

xvw2m8pv2#

考虑改用findall-重复匹配(、后跟非)字符、后跟)或匹配非,字符的组:

s = """aa,bb,m(cc,dd)"""
matches = re.findall(r'(?:\([^(]+\)|[^,])+', s, re.M|re.S)
print('\n'.join(matches))

如果速度是一个问题,可以通过将(放入另一个负字符集并首先交替使用它来使它更有效一些:

(?:[^(,]+|\([^(]+\))+
j5fpnvbx

j5fpnvbx3#

我需要做类似的事情,但我也有嵌套的括号。建议的正则表达式不处理嵌套。
我找不到正则表达式的解决方案,但这里有一个python函数的解决方案,可以实现同样的效果:

def comma_split(text: str) -> list[str]:
    flag = 0
    buffer = ""
    result = []
    for char_ in text:
        if char_ == "[":
            flag += 1
        elif char_ == "]":
            flag -= 1
        elif char_ == "," and flag == 0:
            result.append(buffer)
            buffer = ""
            continue
        buffer += char_
    if buffer:
        result.append(buffer)
    return result
ffdz8vbo

ffdz8vbo4#

尝试:r',([^,()][(][^()][)][^,])|([^,]+)'
在regex101上测试:https://regex101.com/r/pJxRwQ/1

相关问题