Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/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_Regex_String_Split - Fatal编程技术网

Python正则表达式:跳过引号之间分隔符的问题

Python正则表达式:跳过引号之间分隔符的问题,python,regex,string,split,Python,Regex,String,Split,我不熟悉正则表达式,并试图以(和/或)作为分隔符进行拆分 我使用了以下提供的解决方案: 并将我的正则表达式修改为: re.split(r'(\s+and\s+|\s+or\s+)(?=(?:[^"]*"[^"]*")*[^"]*$)', s) 除了以下输入之外,它对我的大多数用例都很有用: 'col1 == "val1" or col2 == \'val1 and " val2\'' 对于这种特殊情况,拆分失败,我尝试用不同的组合修改上述正则表达式,但没有成功。是否有人可以帮助修复此正则表达

我不熟悉正则表达式,并试图以(和/或)作为分隔符进行拆分

我使用了以下提供的解决方案:

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

re.split(r'(\s+and\s+|\s+or\s+)(?=(?:[^"]*"[^"]*")*[^"]*$)', s)
除了以下输入之外,它对我的大多数用例都很有用:

'col1 == "val1" or col2 == \'val1 and " val2\''
对于这种特殊情况,拆分失败,我尝试用不同的组合修改上述正则表达式,但没有成功。是否有人可以帮助修复此正则表达式。

您可以使用基于以下内容的解决方案:

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\'']

详细信息

  • (?V1)
    -允许以零长度匹配进行拆分的标志
  • (?:“[^”]*“[^']*”)\K
    -双引号或单引号之间的子字符串,使用
    \K
    从匹配值中丢弃(因此,当此模式匹配时,匹配为空字符串)
  • |
    -或
  • (\s+(?:和|或)\s+
    -1+空格、
    和1+空格

非常感谢@WiktorStribiżew,这解决了我的问题。是否有可能对您的正则表达式进行分解,并解释其工作原理?我又被这个正则表达式卡住了。这个正则表达式不适用于输入:“col2==‘val1和val2’”。它在“and”上拆分字符串“单词在单引号之间。您能帮忙吗?@HarshBafna我认为唯一正确的方法是使用PCRE模式,如
(?:“[^”]*“|”[^']*”)(*跳过)(*F)|(\s+和\s+\s+或\s+)
(请参阅)。在Python中,您只能执行上面我发布的操作。请告诉我它是否适用于youThanks Wiktor,非常感谢。我会尝试一下。另外,您的意思是,内置的re模块不可能做到这一点吗?我对如此复杂的表达式不太在行。您能推荐一些我可以学习regex的好材料吗?@HarshBafna我不知道了解你的regex知识水平:),因此我只能建议你在上所有课程,通读,(还有许多其他链接到伟大的在线资源),以及所谓的社区。同样,值得一看。