首页 > 解决方案 > Python 正则表达式:在引号之间跳过分隔符的问题

问题描述

我是正则表达式的新手,并试图根据(和/或)作为分隔符进行拆分

我使用了提供的解决方案:https ://stackoverflow.com/a/18893443/5164936

并将我的正则表达式修改为:

re.split(r'(\s+and\s+|\s+or\s+)(?=(?:[^"]*"[^"]*")*[^"]*$)', s)

对于我的大多数用例来说,这就像一个魅力,除了以下输入:

'col1 == "val1" or col2 == \'val1 and " val2\''

对于这种特殊情况,拆分失败,我尝试使用不同的组合修改上述正则表达式,但没有成功。有人可以帮助修复这个正则表达式。

标签: pythonregexstringsplit

解决方案


您可以使用基于PyPi 正则表达式的解决方案:

import regex

s = 'col1 == "val1" or col2 == \'val1 and " val2\''
res = regex.split(r'''(?V1)(?:"[^"]*"|'[^']*')\K|(\s+(?:and|or)\s+)''', s)
print([x for x in res if x])
# => ['col1 == "val1"', ' or ', 'col2 == \'val1 and " val2\'']

在线查看Python 演示

细节

  • (?V1)- 允许在零长度匹配处拆分的标志
  • (?:"[^"]*"|'[^']*')\K- 双引号或单引号之间的子字符串,使用\K 匹配重置运算符从匹配值中丢弃(因此,当此模式匹配时,匹配为空字符串)
  • |- 或者
  • (\s+(?:and|or)\s+)- 1+ 个空格,andor1+ 个空格。

推荐阅读