2016-07-29 156 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