【发布时间】:2020-09-10 16:11:57
【问题描述】:
如何匹配下面字符串中 () 之间的 2 个不同组
data foo (drop = DISCOUNT price RENAME = ( PROV_NM1= PROV_NM PROV_ST_NM1 = PROV_ST_NM) where = ( product = 'whizmo' and product < 10 )) bar( drop= DISCOUNT price rename= ( startDate = beginDate ) );
我需要匹配这个以获得 2 个组:
foo (drop = DISCOUNT price RENAME = ( PROV_NM1= PROV_NM PROV_ST_NM1 = PROV_ST_NM) where = ( product = 'whizmo' and product < 10 ))bar( drop= DISCOUNT price rename= ( startDate = beginDate ) )
我这几天一直在安静地尝试它,并想出了这个正则表达式:
(?i)(data)\s+((\w+)(?=(\s*))(?:\4\w+))?\s*(\(((.|\n)*?)\);)?
可以看这里:regex demo
它适用于大多数情况,但在上述示例中没有给出 2 个单独的组,因为它匹配单个组中括号内的所有内容。
我也尝试了一些递归模式,但遗憾的是无法弄清楚。对此的任何帮助或指导表示赞赏。谢谢。
【问题讨论】:
-
看起来你需要递归或堆栈。编写一个简单的解析器可能更容易,或者如果这是一些标准符号,请使用现有的工业级解析器。不过,尚不完全清楚该符号的规范是什么。
-
也许这个页面会有所帮助stackoverflow.com/a/35271017/5424988
-
我确实尝试过为此使用递归,但它没有按预期工作,我们尝试的所有内容都与一个相同或不匹配。我们尝试的简单递归之一是:
(?i)((\w+)(\s*=\s*)(\((.*?)\))?)(?5),但它与预期的不匹配。将解析器开发作为正则表达式的最后一个选项将有助于解决可能遇到的多种模式。 -
对于规范,我们实际上是在尝试解析一些转换的 SAS 数据步骤语句。
标签: python-3.x regex pcre regex-group