如何在python中执行条件拆分?

如何在python中执行条件拆分?,python,regex,python-2.7,Python,Regex,Python 2.7,当逗号不被()包围时,我想用逗号分割字符串 期望分割 split = ['a','b','c','test(1,2,3)','g','h','test(2,4,6)'] 如何使用正则表达式python 我迄今为止的努力 splits = [m.start() for m in re.finditer(',', string_i)] paranths = {10: 16, 26: 32} #using function lst = [] first = 1 for l in splits:

当逗号不被()包围时,我想用逗号分割字符串

期望分割

split = ['a','b','c','test(1,2,3)','g','h','test(2,4,6)']
如何使用正则表达式python

我迄今为止的努力

splits = [m.start() for m in re.finditer(',', string_i)]

paranths = {10: 16, 26: 32} #using function

lst = []

first = 1
for l in splits:
    print l
    for m in paranths:
        if (l < m and l < paranths[m]):
            #print m,':',l,':',paranths[m]
            lst.append(string_i[first:l])
            first = l+1
            break
            break
splits=[m.start()表示re.finditer(',',string_i)中的m]
paranths={10:16,26:32}#使用函数
lst=[]
第一个=1
对于拆分中的l:
打印l
对于帕拉尼思的m:
如果(l
您可以使用负向后看和负向前看来查找所有未被括号括起来的
()

(?
下面是一个活生生的例子:


详细信息

  • (?如果括号内的字符在下一次出现之前匹配,它将取消下一次出现的匹配
  • (?!)
    如果括号内的字符在事件发生后匹配,它将取消此事件的匹配
  • [)(]
    匹配括号

您可以使用负向后看和负向前看来查找所有未被括号括起来的

(?
下面是一个活生生的例子:


详细信息

  • (?如果括号内的字符在下一次出现之前匹配,它将取消下一次出现的匹配
  • (?!)
    如果括号内的字符在事件发生后匹配,它将取消此事件的匹配
  • [)(]
    匹配括号

    • 不是正则表达式,但可能有效:

      def my_split(s):
      
          splits0 = s.split(',')
          splits = []
      
          BEWEEN_PARENTHESIS = False
      
          # join everything between parenthesis
          for j, elem in enumerate(splits0):
              if not BEWEEN_PARENTHESIS:
                  if "(" in elem:
                      BEWEEN_PARENTHESIS = True
                      start = j
                  else:
                      splits.append(elem)
      
              elif BEWEEN_PARENTHESIS and ")" in elem:
      
                  BEWEEN_PARENTHESIS = False
                  splits.append(",".join(splits0[start:j+1]))
      
          return splits
      
      s = "a,b,c,test(1,2,3),g,h,test(2,4,6)"
      print(my_split(s))
      

      不是正则表达式,但可能有效:

      def my_split(s):
      
          splits0 = s.split(',')
          splits = []
      
          BEWEEN_PARENTHESIS = False
      
          # join everything between parenthesis
          for j, elem in enumerate(splits0):
              if not BEWEEN_PARENTHESIS:
                  if "(" in elem:
                      BEWEEN_PARENTHESIS = True
                      start = j
                  else:
                      splits.append(elem)
      
              elif BEWEEN_PARENTHESIS and ")" in elem:
      
                  BEWEEN_PARENTHESIS = False
                  splits.append(",".join(splits0[start:j+1]))
      
          return splits
      
      s = "a,b,c,test(1,2,3),g,h,test(2,4,6)"
      print(my_split(s))
      

      如上所述,您可以使用反向向后看和向前看模式匹配

      import re
      
      my_str = r"a,b,c,test(1,2,3),g,h,test(2,4,6)"
      
      print(re.split('(?<!\(.),(?!.\))', my_str))
      
      重新导入
      my_str=r“a,b,c,测试(1,2,3),g,h,测试(2,4,6)”
      
      打印(关于分割(')(?如上所述,您可以使用负片后向和前向模式匹配

      import re
      
      my_str = r"a,b,c,test(1,2,3),g,h,test(2,4,6)"
      
      print(re.split('(?<!\(.),(?!.\))', my_str))
      
      重新导入
      my_str=r“a,b,c,测试(1,2,3),g,h,测试(2,4,6)”
      
      print(re.split(“(?到目前为止您的努力是什么。在这里发布您的代码您的示例字符串是否可以包含以下示例之一?
      a,b,c,test(1,2,(3,4,5)),g
      a,b,c,test)(1,2,3))(,g,h
      。如果是这种情况,则无法使用regex(递归行为和无效括号语法)正确地执行此操作。到目前为止您的努力是什么。在这里发布您的代码您的示例字符串是否可以包含以下示例之一?
      a,b,c,test(1,2,(3,4,5)),g
      a,b,c,test)(1,2,3))(,g,h
      。如果是这种情况,您无法使用regex(递归行为和无效括号语法)正确执行此操作。我刚才看到,当逗号位于括号内时,您希望跳过逗号,而不是在它们前面或后面紧跟括号时。因此,这可能不是正确的解决方案。我刚才看到,当逗号位于括号内时,您希望跳过逗号,而不是在它们前面或后面紧跟括号时。因此,这可能不是正确的解决方案。谢谢@Ivan Luchko你的解决方案很好用。但是如果可能的话我想跳转到正则表达式。谢谢@Ivan Luchko你的解决方案很好用。但是如果可能的话我想跳转到正则表达式。谢谢它对上面的字符串有效,但是我应该修改什么使它对我的_str=r“a,b,c,test('1','2','3'),g,h,test('2','4','6')“r”a,b,c,test 1','2','2','3'),g,h,test有效('2','4','6')。替换('2','3'),g,h,test('2','4','6'),'r'a,b,c,test('1','2','4','6'),'2','3','h,test('1','2','4','6')。请注意,第一部分中的单引号'位于双引号'之间,感谢它对上述字符串起作用,但是我应该修改什么使它对我的字符串起作用呢请注意,第一部分中的单引号“位于双引号之间”