Grep并替换字符串的模糊模式

时间:2016-07-29 11:47:10

标签: python regex

我有一些带有python代码和装饰器的文件:

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

这些装饰器之间的唯一区别是字符串'api.module.function_name' - func名称和模块不同。根据这个参数名称,有时这个装饰器是单行的,有时是两行或三行。

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

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

有办法吗?

2 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

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

请参阅demo

答案 1 :(得分: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展开到正则表达式中的第一个组(.+)