python - Python 正则表达式:在引号之间跳过分隔符的问题
问题描述
我是正则表达式的新手,并试图根据(和/或)作为分隔符进行拆分
我使用了提供的解决方案:https ://stackoverflow.com/a/18893443/5164936
并将我的正则表达式修改为:
re.split(r'(\s+and\s+|\s+or\s+)(?=(?:[^"]*"[^"]*")*[^"]*$)', s)
对于我的大多数用例来说,这就像一个魅力,除了以下输入:
'col1 == "val1" or col2 == \'val1 and " val2\''
对于这种特殊情况,拆分失败,我尝试使用不同的组合修改上述正则表达式,但没有成功。有人可以帮助修复这个正则表达式。
解决方案
您可以使用基于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+ 个空格,and
或or
1+ 个空格。
推荐阅读
- vue.js - 在数据透视模式下隐藏 Ag-Grid 中的记录数
- cloud - 用于边缘计算的 CEP
- x11 - 为什么没有安全措施来防止通过 X11 在其他应用程序窗口上绘图?
- ruby-on-rails - 无法解密 config/credentials.yml.enc
- akka - Akka actor 文档中的“现代计算机体系结构上共享内存的错觉”是什么意思?
- algorithm - 创建反向链表
- javascript - 在 Vue.js 中切换过滤结果时的奇怪行为
- java - 为什么intellij idea说没有使用该功能
- java - Flux 基于日期时间属性发射元素
- r - 用 3 种不同颜色绘制散点图