【问题标题】:Split string with comma only not between parenthesis [duplicate]仅在括号之间不使用逗号分割字符串[重复]
【发布时间】:2020-02-03 07:12:03
【问题描述】:

我在正则表达式中搜索用逗号分隔的字符串,而不是在 python 中的括号之间:

示例:

string = '(parent son, daugther  , father ), sister'

预期结果:

['(parent son, daugther  , father )', 'sister']

感谢您的帮助

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    一般来说,正则表达式不擅长匹配嵌套/递归结构。因此,虽然它可能有可能成功,但您可以更轻松地手动进行拆分,例如

    groups = []
    nesting = 0
    idx = 0
    for group in re.finditer(r'[,\(\)]', string):
        assert nesting >= 0
        if group[0] == '(':
            nesting += 1
        elif group[0] == ')':
            nesting -= 1
        elif nesting > 0:
            continue # ignore commas in parens
        else:
            groups.append(string[idx:group.start()].strip())
            idx = group.end()
    # after last group
    groups.append(string[idx:].strip())
    

    【讨论】:

      【解决方案2】:

      对于您的具体示例,我将使用正则表达式拆分,即使用正则后向拆分,即以逗号(以及后面的空格,如果有的话)拆分字符串,前面是右圆括号:

      import re
      
      string = '(parent son, daugther  , father ), sister'
      
      output = re.split(r'(?<=\)),\s+', string)
      # ['(parent son, daugther  , father )', 'sister']
      

      【讨论】:

      • string = '(parent son, daugther , father ), sister, uncle' 呢?
      • 您应该澄清您的问题并使用完整的示例,否则所有人都很难回答
      • 这不是我的问题。
      • 对不起!我的错误:)
      【解决方案3】:

      regex代替re,可以用(*SKIP)(*FAIL)

      import regex
      
      str = '(parent son, daugther  , father ), sister'
      res = regex.split(r'\(.+?\)(*SKIP)(*FAIL)|,', str)
      print(res)
      

      输出:

      ['(parent son, daugther  , father )', ' sister']
      

      工作原理:

      • \(.+?\) 正在尝试将左括号和右括号与里面的一些数据进行匹配
      • (*SKIP)(*FAIL) 如果找到括号,则丢弃匹配项
      • |否则
      • , 匹配逗号。在这一点上,我们确定它不在括号之间。

      【讨论】:

        猜你喜欢
        • 2013-02-20
        • 2012-10-31
        • 2021-06-12
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多