2016-07-29 137 views
0

的模糊模式识别我有Python代码的几个文件和装饰是这样的:grep和替换字符串

@trace('api.module.function_name', info=None, custom_args=False) 

这些装饰之间的唯一区别是字符串“api.module.function_name” - 功能名称,模块不同。取决于这个参数名称,有时候这个装饰器是一线的,有时它是两线或三线的。

我想用另一个替换这些装饰器 - 更简单,就像“@my_new_decorator”。

我想过一些正则表达式,但我不知道这种“模糊”搜索是否可能。我试过^@trace([A-Za-z0-9]\, custom_args=False)$ 但它不起作用。

有没有办法做到这一点?

+0

好一个正则表达式如果这样做不起作用,那么您需要更类似'^ \ s * @ trace \(。+ \)$'的东西,因为您匹配的是一个字母数字字符,并且只有在全部位于第0列时才匹配。 – moopet

+0

你可能会需要在你的正则表达式中使用多行标志:'re.M' – pwnsauce

回答

1

像这样的东西应该工作:

(\n|^)\s*@trace\(\s*'[^']*',\s*info=None,\s*custom_args=False\s*\)\s*(\r|\n|$) 

demo

1

使用^@trace\('api\.(.+)\.(.+)', info=None, custom_args=False\)$用多标志。

您可能需要使用re.sub

>>> import re 
>>> pattern = re.compile('^@trace\('api\.(.+)\.(.+)', info=None, custom_args=False\)$', re.M) 
>>> re.sub(pattern, '@my_new_decorator('\1', '\2')', '@trace('api.module.function_name', info=None, custom_args=False)') 
@my_new_decorator('module', 'function_name') 

的正则表达式

的演示中看到this正如你可以看到\1扩展到第一组中的正则表达式(.+)

+0

谢谢,这个工程也是如此,所以我们打开它。 :) – Paul