【问题标题】:Python - Split by comma skipping the content inside parenthesesPython - 用逗号分割,跳过括号内的内容
【发布时间】:2015-11-04 16:40:00
【问题描述】:

我需要用逗号分割一个字符串,但我对这种情况有疑问:

TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME)), SECOND , THIRD

我想拆分获取:

var[0] = "TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME))"
var[1] = "SECOND"
var[2] = "THIRD"

谢谢

【问题讨论】:

  • 所以问题是不是字符串中的所有逗号都应该被分割?你如何区分那些应该和那些不应该?是括号吗?这个字符串是从哪里来的,为什么不使用例如引用区分?如果您想re.split,您的具体示例可以使用,(?!.*\)) 之类的东西(即后面没有右括号的逗号),但这在一般情况下可能不起作用。
  • 你需要通过传统的for循环来完成。
  • 对于匹配嵌套括号(或标签等)的一般情况,您需要编写一个真正的解析器:将输入标记化,然后根据您的语法进行解析。
  • var.split(',') 为你工作?
  • @Onilol 你真的读过这个问题吗?请叫“你”

标签: python regex replace


【解决方案1】:

这是适用于您的示例的非常简单的解析器方法:

def top_level_split(s):
    """
    Split `s` by top-level commas only. Commas within parentheses are ignored.
    """

    # Parse the string tracking whether the current character is within
    # parentheses.
    balance = 0
    parts = []
    part = ''

    for c in s:
        part += c
        if c == '(':
            balance += 1
        elif c == ')':
            balance -= 1
        elif c == ',' and balance == 0:
            parts.append(part[:-1].strip())
            part = ''

    # Capture last part
    if len(part):
        parts.append(part.strip())

    return parts

my_list = top_level_split("TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME)), SECOND , THIRD")
print(my_list)

【讨论】:

    【解决方案2】:

    您可以使用这个基于负前瞻的正则表达式:

    ,(?!(?:[^(]*\([^)]*\))*[^()]*\))
    

    此正则表达式正在查找带有断言的逗号,该断言确保逗号不在括号中。这是使用负前瞻来完成的,它首先消耗所有匹配的(),然后是)这假设括号是平衡且未转义的

    RegEx Demo

    代码:

    >>> s = 'TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME)), SECOND , THIRD'
    print re.split(r',(?!(?:[^(]*\([^)]*\))*[^()]*\))', s)
    
    ['TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME))', ' SECOND ', ' THIRD']
    

    或者:

    >>> s = 'TEXT EXAMPLE (THIS, IS (A EXAMPLE, BUT NOT WORKS, FOR ME)), SECOND , THIRD'
    >>> print re.split(r',(?!(?:[^(]*\([^)]*\))*[^()]*\))', s)
    ['TEXT EXAMPLE (THIS, IS (A EXAMPLE, BUT NOT WORKS, FOR ME))', ' SECOND ', ' THIRD']
    

    【讨论】:

    • 很遗憾,这是一个丑陋的正则表达式!你能至少解释一下吗?
    • 我知道因为有很多(),它看起来很丑。我试图在答案中解释它。
    • 这应该被选为答案。此正则表达式适用于一般情况,也可以忽略括号内的逗号。
    • 注意,当第一个之前有一个项目时,它将不起作用。例如 'FIRST, TEXT Example (THIS, IS (A Example, but NOT WORKS, FOR ME)), SECOND , THIRD' 。在这种情况下,第一个元素将是“FIRST,TEXT EXAMPLE (...)”并且不会被拆分。
    【解决方案3】:

    感谢 jonrsharpe

    text = "TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME)), SECOND , THIRD"
    array = re.split(r',(?!.*\))', text)
    for item in array:
        # Print and remove the first space
        print item.strip(" ")
    

    结果:

    TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME))
    SECOND
    THIRD
    

    【讨论】:

      【解决方案4】:

      你可以使用rsplit:

      l1 = "TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME)), SECOND , THIRD".rsplit(",", 2)
      
      for line in l1:
         print line
      
      TEXT EXAMPLE (THIS IS (A EXAMPLE, BUT NOT WORKS, FOR ME))
      SECOND
      THIRD
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 2018-11-22
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-02
        相关资源
        最近更新 更多