首页 > 解决方案 > 正则表达式仅在成对括号后对字符进行正向前瞻

问题描述

我正在尝试在 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)

提前致谢!

标签: pythonregex

解决方案


您可以使用

(?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*=模式的结尾紧挨当前位置的右侧。

推荐阅读