【问题标题】:split by comma if comma not in between brackets while allowing characters to be outside the brackets with in the same comma split如果逗号不在括号之间,则以逗号分隔,同时允许字符在括号外并以相同的逗号分隔
【发布时间】:2019-03-12 05:56:34
【问题描述】:

我有这个 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)

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

【问题讨论】:

  • 我把“期望”这个词改成了“希望”
  • 你是怎么得到m(ee,ff)的?
  • 我不是,这就是我想要的。它正在输出 m(ee\n ,\n ff)\n 。
  • 没有,但原字符串中没有m(ee,ff)
  • 抱歉,这是我在编辑时犯的一个错误。现在修复它

标签: python regex


【解决方案1】:

您可以将此正则表达式与前瞻用于拆分:

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

RegEx Demo

正则表达式详细信息:

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

【讨论】:

    【解决方案2】:

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

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

    如果速度是个问题,您可以通过将( 放入另一个否定字符集中并先交替使用它来提高效率:

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

    【讨论】:

    • 检查在regex101.com/r/UXdHRe/2 上执行的步骤数(272 步)与我建议的拆分正则表达式(146 步)。
    【解决方案3】:

    试试 : r',([^,()][(][^()][)][^,])|([^, ]+)'

    在 regex101 上测试:https://regex101.com/r/pJxRwQ/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 2011-06-30
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      相关资源
      最近更新 更多