Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 忽略基于周围字符的正则表达式拆分中的大小写_Python_Python 3.x_Regex_Split - Fatal编程技术网

Python 忽略基于周围字符的正则表达式拆分中的大小写

Python 忽略基于周围字符的正则表达式拆分中的大小写,python,python-3.x,regex,split,Python,Python 3.x,Regex,Split,我有一个字符串,我想用某些特殊字符分割。但我不想在方括号内拆分任何内容。如何设置正则表达式以忽略方括号内的案例 formula = '[var1]+[v/ar/2]^var3/var4' #assume no spaces in the formula re.split('[-+*/&,^%]',formula) #produces ['[var1]', '[v', 'ar', '2]', 'var3', 'var4'] 期望输出: ['[var1]', '[v/ar/2]', 'va

我有一个字符串,我想用某些特殊字符分割。但我不想在方括号内拆分任何内容。如何设置正则表达式以忽略方括号内的案例

formula = '[var1]+[v/ar/2]^var3/var4' #assume no spaces in the formula
re.split('[-+*/&,^%]',formula) #produces ['[var1]', '[v', 'ar', '2]', 'var3', 'var4']
期望输出:

['[var1]', '[v/ar/2]', 'var3', 'var4']
我想我需要使用一些奇特的负前瞻和负前瞻,但我还没有找到一个有效的组合。

我的解决方案(没有任何巫毒正则表达式)是将其分为3个步骤:

  • 得到所有括号内的字符串
  • 从公式中删除所有带括号的字符串
  • 在剩余字符串上拆分

  • 请您尝试以下方法:

    import re
    formula = '[var1]+[v/ar/2]^var3/var4' #assume no spaces in the formula
    m = re.findall(r'\[.+?\]|\w+', formula)
    print(m)
    
    输出:

    ['[var1]', '[v/ar/2]', 'var3', 'var4']
    
    正则表达式
    \[.+?\]\124;\ w+
    与以下任一项匹配:

    • 用方括号括起来的任何东西
    • 非特殊字符的序列

    如果您想使用拆分,您可以使用另一种方式来捕获拆分后要保留在组1中的内容,或者匹配要拆分的位置

    在结果中,从结果中删除空字符串

    • (\[[^][]*])
      捕获组1,从开始到结束方括号捕获
    • |
    • [-+*/&,^%]
      匹配要拆分的任何列出的字符
    |

    范例

    import re
    
    s="[var1]+[v/ar/2]^var3/var4"
    result = list(filter(None, re.split(r"(\[[^][]*])|[-+*/&,^%]", s)))
    print(result)
    
    输出

    ['[var1]', '[v/ar/2]', 'var3', 'var4']
    

    你能解释一下第一组的逻辑吗?为什么不使用同样有效的
    (\[.*?\])
    @EnochOu,而是像示例中那样使用否定字符类来防止不必要的回溯呢。
    ['[var1]', '[v/ar/2]', 'var3', 'var4']