2016-07-29 18 views
0

Ich habe ein paar Dateien mit Python-Code und Dekorateure wie folgt aus:Grep und ersetzen Fuzzy-Muster der Zeichenfolge

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

Der einzige Unterschied zwischen diesen Dekorateure ist der String ‚api.module.function_name‘ - Funktionsname und Modul sind anders. Und abhängig von diesem Namen ist dieser Dekorateur manchmal einreihig, manchmal zwei- oder dreireihig.

Ich möchte diese Dekoratoren durch die andere ersetzen - einfacher, wie "@my_new_decorator".

Ich dachte über einige Regex, aber ich habe keine Ahnung, ob es für solche "unscharfe" Suche möglich ist. Ich habe versucht ^@trace([A-Za-z0-9]\, custom_args=False)$ Aber es funktioniert nicht.

Gibt es eine Möglichkeit, es zu tun?

+0

Nun ein regex sehen So etwas würde nicht funktionieren, du brauchst etwas mehr wie '^ \ s * @ trace \ (. + \) $', weil du ein alphanumerisches Zeichen und nur dann eine Übereinstimmung findest, wenn das alles in Spalte 0 ist. – moopet

+0

Sie könnten benötige das mehrzeilige Flag in deiner Regex: 're.M' – pwnsauce

Antwort

1

So etwas sollte funktionieren:

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

Siehe demo

1

Verwenden ^@trace\('api\.(.+)\.(.+)', info=None, custom_args=False\)$ mit einem mehrzeiligen Flagge.

Sie möchten re.sub verwenden:

>>> 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 Siehe für die Demo der Regex

Wie Sie \1 erweitern, um die erste Gruppe in der Regex (.+)

+0

Danke, das funktioniert auch, also verbessere es. :) – Paul

Verwandte Themen