2016-12-17 5 views
-1

Meine Python-Funktion Definition lautet wie folgt:Python Regex drucken (Alphabet nur) Wörter mit Leerzeichen und verstehen sich inklusive Nicht-ASCII-Zeichen

def name_extractor(dirty_name): 
    print Name 
    clean_name = re.sub('\W'," ", dirty_name) 
    print clean_name 

Die Proben von schmutzigen Namen enthält:

(10) Johny Doe 
Eric E. Shelby 
(1) Chris Melton - ŗ≤ēŗ≤Ņŗ≤įŗ≤Ņŗ≤ēŗ≥ć ŗ≤ēŗ≥Äŗ≤įŗ≥ćŗ≤§ŗ≤Ņ 
Jonas Alexander Bay 
Christopher Rockstar - An awesome guy 
Jones Collier 

I möchte nur die Ausgabe, um nur zu drucken:

Johny Doe 
Eric E. Shelby 
Chris Melton 
Jonas Alexander Bay 
Christopher Rockstar 
Jones Collier 

Wie Sie den regulären Ausdruck optimieren, um nur Namen zu drucken wie es ist und alles (die zufälligen Zeichen oder normale ASCII-Zeichen) nach "-" ausschließen?

Antwort

2

Sie brauchen keine regulären Ausdrücke dafür. Split jede Zeile auf ' - ' und dann herauszufiltern, die Zeichen nicht wollen, das zusätzliche Leerzeichen Strippen:

>>> l = '''(10) Johny Doe 
... Eric E. Shelby 
... (1) Chris Melton - ŗ≤ēŗ≤Ņŗ≤įŗ≤Ņŗ≤ēŗ≥ć ŗ≤ēŗ≥Äŗ≤įŗ≥ćŗ≤§ŗ≤Ņ 
... Jonas Alexander Bay 
... Christopher Rockstar - An awesome guy 
... Jones Collier'''.splitlines() 
>>> for line in l: 
...  print(''.join(c for c in line.split(' - ')[0] if c.isalpha() or c in ' .').strip()) 
... 
Johny Doe 
Eric E. Shelby 
Chris Melton 
Jonas Alexander Bay 
Christopher Rockstar 
Jones Collier 
+1

Same nicht-re Antwort hier reichen. Beat mich dazu –

+0

Dies entspricht nicht eindeutig der OPs Frage * Wie man den regulären Ausdruck zwicken * – RomanPerekhrest

+0

@RomanPerekhrest - Das OP akzeptiert diese Antwort, so dass sie offensichtlich nach dem richtigen Ergebnis mit jeder Strategie eher als ein falsches Ergebnis suchen mit einer falschen Strategie, aber danke für das Teilen. – TigerhawkT3

0

Um alle Nicht-ASCII-Zeichen ausschließen und alle anderen, die nach dem Bindestrich gehen - - es wäre genug, um zu Ersetzen Sie sie durch eine leere Zeichenfolge "".
Short-Lösung unter Verwendung spezifischer RegexMuster:

dirty_name = ''' 
(10) Johny Doe 
Eric E. Shelby 
(1) Chris Melton - ŗ≤ēŗ≤Ņŗ≤įŗ≤Ņŗ≤ēŗ≥ć ŗ≤ēŗ≥Äŗ≤įŗ≥ćŗ≤§ŗ≤Ņ 
Jonas Alexander Bay 
Christopher Rockstar - An awesome guy 
Jones Collier''' 

clean_name = '\n'.join(l.lstrip() for l in re.sub(r'[^\x00-\x7f]|[\d()]| - .+\b(?=\n)', "", dirty_name).split('\n')) 
print(clean_name) 

Der Ausgang:

Johny Doe 
Eric E. Shelby 
Chris Melton 
Jonas Alexander Bay 
Christopher Rockstar 
Jones Collier 

Edit: entfernt links führende Leerzeichen Ursache @ TigerhawkT3 ist zu "space-sensitive" (in seinem eigene Religion)

PS\x00-\x7f ist ASCII Zeichen

+0

Dies erzeugt nicht die gewünschte Ausgabe - Sie haben einen führenden Platz in einer Zeile. – TigerhawkT3

+0

@ TigerhawkT3, so? Es wird eine völlig falsche Lösung mit diesem Raum ?! – RomanPerekhrest

+0

Nun ...... ja. – TigerhawkT3

Verwandte Themen