【问题标题】:matching expression to retreive first function name using regex匹配表达式以使用正则表达式检索第一个函数名称
【发布时间】:2021-03-03 04:24:01
【问题描述】:

我有一个下面的字符串

TimeStampDiff(SQL_TSI_DAY,  TimeStampAdd(SQL_TSI_DAY, 2,  "function_test"."ORDERS"."ORDER_DATE" ) ,  "function_test"."ORDERS"."ORDER_DATE" ) 

这与我在https://pythex.org/ 中测试的正则表达式模式不匹配

^\s*([\w]+)\s*\(.*?\)$

但我有一个与我的正则表达式模式完全相似的表达式,如下所示

TimeStampDiff(SQL_TSI_DAY,  TimeStampAdd(SQL_TSI_DAY, 2,  "function_test"."ORDERS"."ORDER_DATE" ) ,  "function_test"."ORDERS"."ORDER_DATE" )

我已经用相同的正则表达式模式测试了两个表达式,但第一个不匹配,第二个匹配。 请问是什么原因啊!!

【问题讨论】:

  • 你想在这里匹配什么?您的问题忘记告诉我们这一重要信息。
  • 所以我的正则表达式匹配整个字符串并在我的情况下检索第一个函数名称 TimeStampDiff 将是结果
  • 第一个字符串末尾有一个空格,是拼写错误。您需要做的就是在最后删除$

标签: python regex


【解决方案1】:

虽然Python不支持recursive regex,你可以启用 通过安装regex 模块来实现:

pip install regex

然后你可以这样说:

#!/usr/bin/python

import regex

s = 'TimeStampDiff(SQL_TSI_DAY,  TimeStampAdd(SQL_TSI_DAY, 2,  "function_test"."ORDERS"."ORDER_DATE" ) ,  "function_test"."ORDERS"."ORDER_DATE" ) '

#m = regex.match(r'(\w+)\s*\((?:[^()]+|(?R))*\)', s)
m = regex.match(r'(\w+)\s*\(([^()]+|\(\s*(?2)\s*\)|(?R))*\)', s)
if m:
    print(m.group(1))   # prints "TimeStampDiff"

其中(?R) 递归地表示整个正则表达式。
然后上面的正则表达式通过平衡匹配嵌套函数调用 左括号和右括号的计数。

DEMO

【讨论】:

  • 如果我们查看这个字符串,它不正确匹配 Concat(upper("function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" ),Concat(("function_test"."PRODUCT_CATEGORIES". "CATEGORY_ID" ),Replace(("Function_Testing"."CUSTOMERS"."WEBSITE"), (\'a\'),(\'s\'))))
  • 好的,说得好。即使您的原始字符串没有,我也应该考虑参数包含括号的情况。我已经更新了我的答案。
  • 正则表达式不适用于此表达式Concat((Upper("Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME" )) ,( Concat("Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME" , Replace(("Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME") ,( 'a'),( 's')) ) ))..请检查他们是什么原因
  • 如果我对参数使用多个括号Concat(upper("function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" ),Concat(("function_test"."PRODUCT_CATEGORIES"."CATEGORY_ID" ),Replace(("Function_Testing"."CUSTOMERS"."WEBSITE" ), (((\'a\'))),(\'s\')))),它不起作用
  • 感谢您的评论。我已经更新了我的答案。现在无论函数参数周围的额外括号如何,它都会匹配。 (?2) 还表示代表第二个捕获组的递归正则表达式。
【解决方案2】:

第一个字符串的末尾有一个空格字符。由于正则表达式模式搜索结束括号作为字符串的最后一个字符,因此它产生不匹配。

【讨论】:

  • 所以我可以将我的正则表达式更改为这个 ^\s*([\w]+)\s*(.*?)\s*$
  • 这取决于您要完成的工作。
  • 我想从第一个(括号到最后一个)括号匹配,因此我使用了 $
  • 我仍然不确定这里的目标是什么。匹配组 ([\w]+) 将仅捕获第一个左括号之前的文本。为什么要匹配字符串的其余部分?
  • Yaa 首先应该是文本,然后是(以及任意数量的字符和最后一个)括号
猜你喜欢
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多