python - 正则表达式仅在成对括号后对字符进行正向前瞻
问题描述
我正在尝试在 Python 中使用正则表达式解析 SQL 代码。
我需要一个表达式,当它以字符串结尾或逗号结尾时分隔组,但前提是它们跟随在匹配的括号之后。
我当前的正则表达式仅匹配第二组直到第一次出现逗号,而不管括号计数:
(?m)^\s*'?([A-Za-z0-9_-]+)'?\s*=\s*((?s:.)*?)(?:\s*)(?=,|\Z)
例如,在下面的字符串中:
COL1 = DEF1,
COL2 = DEF(TEST,
TEST2),
COL3 = FUN(1, 2),
我得到:
0: DEF1
1: DEF(TEST
2: FUN(1
我希望它匹配:
0: DEF1
1: DEF(TEST,
TEST2)
2: FUN(1, 2)
提前致谢!
解决方案
您可以使用
(?sm)^\s*'?([\w-]+)'?\s*=\s*(.*?)(?=^\s*'?[\w-]+'?\s*=|\Z)
查看正则表达式演示
细节
(?sm)
- DOTALL 和 MULTILINE 选项^
- 行首 -\s*
- 0+ 个空格'?
- 一个可选的'
([\w-]+)
- 第 1 组:一个或多个单词或-
字符'?
- 一个可选的'
\s*=\s*
-=
用 0+ 个空格括起来(.*?)
- 第 2 组:除换行符之外的任何零个或多个字符尽可能少(?=^\s*'?[\w-]+'?\s*=|\Z)
- 一个正向前瞻,要求字符串 (\Z
) 或^\s*'?[\w-]+'?\s*=
模式的结尾紧挨当前位置的右侧。
推荐阅读
- reporting-services - 在图像上叠加文本 SSRS
- audio - 如何修复:device_list:270:找不到声卡(Ubuntu 服务器 18.04)?
- powershell - 如何在所有用户配置文件上获取不同的文件夹名称
- c# - 扩展 Akka.Net
- r - 如何将两个日期子集合并为一列?
- php - db 插入的 Prestashop 产品未显示
- python - 在树莓派 3 上启动时运行两个 python 脚本
- php - sending emails through custom made contact form
- mysql - 移动到 aws 后,CDbConnection 无法打开 DB 连接 Yii
- drupal - Drupal 7视图内部的全局文本写入条件