2016-04-04 4 views
3

ich einen Python-Code habe, dass zum Beispiel wie dieRegex ein bestimmtes Wort mit optionalem Komma und Raum ersetzen um es

class Foo(Bar, Baz, Jazz): 
    pass 

oder dass

class Foo(Baz, Bar, Jazz): 
    pass 

class Foo(Baz, Jazz, Bar): 
    pass 

Was aussehen könnte ich brauche, ist Bar zu entfernen mit aus der Liste der Eltern in der Vererbungshierarchie.

Also ist die Idee, Vorkommen von Bar mit optionalen , nach links oder (exklusiv) nach rechts zu entfernen.

Mein Versuch, das mit sed.

echo 'class Foo(Baz, Bar, Jazz):' | sed -r 's/(class .*\(.*)([, ]*Bar[, ]*)/\1/' 

gibt korrektes Ergebnis

class Foo(Baz, Jazz): 
+4

Wenn es ein korrektes Ergebnis ist, was ist das Problem? – Maroun

+0

Entfernen Sie 'Python'-Tag, diese Frage hat nichts mit Python zu tun. – anand

Antwort

1

Wenn ich richtig verstehe, dann sollte dies sed tun, was Sie erwarten.

sed -r '/^\s*class.*:\s*$/s/(,\s*Bar\s*|\s*Bar\s*,\s*)//g' file 

Ausgang:

class Foo(Baz, Jazz): 
    pass 

class Foo(Baz, Jazz): 
    pass 
+0

Natürlich nicht, weil es in der Datei Importe gibt, also sollte es nur im Kontext einer Klasse funktionieren. – user1685095

+0

Okay, dieses Mal entfernt es nicht Bar in '' 'Klasse Foo (Bar, Baz, Jazz)' '' – user1685095

+0

Okay, das funktioniert. Vielen Dank. – user1685095

0
(class .*?\(.*?)(?:[\s,]+Bar\s*|\s*Bar[\s,]+) 

Sie this.Replace von \1 .Siehe Demo verwenden können.

https://regex101.com/r/zJ7vZ4/2

import re 
p = re.compile(ur'(class .*?\(.*?)(?:[\s,]+Bar\s*|\s*Bar[\s,]+)') 
test_str = u"class Foo(Bar, Baz, Jazz):\n pass\n\n\n\nclass Foo(Baz, Bar, Jazz):\n pass\n\nclass Foo(Baz, Jazz, Bar):\n pass" 
subst = u"\1" 

result = re.sub(p, subst, test_str) 
+0

'' 'Klasse Foo (Baz, Jazz,):' '' - das linke Komma im letzten Beispiel. Gefällt mir nicht =) – user1685095

+0

@ user1685095 https://regex101.com/r/zJ7vZ4/2 check edit – vks

0

Sie mehrere Ausdrücke angeben können verschiedene Bedingungen wie diese zu erfüllen:

$ cat a.py 
class Foo(Baz, Bar, Jazz): 
    pass 

class Foo(Baz, Jazz, Bar): 
    pass 

class Foo(Bar, Baz, Jazz): 
    pass 
$ sed -r -e '/^\s*class.*,\s*Bar\s*,.*$/s/,\s*Bar\s*,/,/g' -e '/^\s*class.*,\s*Bar\s*\).*$/s/,\s*Bar\s*\)/)/g' -e '/^\s*class.*\(\s*Bar\s*,\s*.*$/s/\(\s*Bar\s*,\s*/(/g' a.py 
class Foo(Baz, Jazz): 
    pass 

class Foo(Baz, Jazz): 
    pass 

class Foo(Baz, Jazz): 
    pass 
$ 

Die Regex auch überprüft hat, dass es Substitution auf Linien durchführen soll, die class Erklärung in Python zu erfüllen, deshalb berührt es keine anderen Linien (zB: Blätter import wie es ist).

Verwandte Themen