2016-11-08 5 views
1

Ich bin nicht sehr gut mit Regex und es verwirrt mich jedes Mal, wenn es aufkommt, anstatt eine möglicherweise falsche Regex-Zeichenfolge zu schreiben, möchte ich eine Zeichenfolge auf andere Weise aufteilen .Aufteilen in Python mit allem ABER bestimmten Satz von Fällen

Sagen wir, ich habe eine Zeichenfolge "Hallo, mein Name ist Joseph! Haha, hallo!" und ich möchte es teilen, wenn ich auf ein nicht-alphanumerisches Zeichen stoße. Also dann, in diesem Fall würde ich erhalten:

"Hallo" "my" "name" "ist" "Joseph" "Haha" "Hallo"

Gibt es eine Möglichkeit um dies ohne eine Regex-Zeichenfolge zu tun? Wie in: Split wann immer Zeichen! = Alphanumerisch?

(Ja, ich weiß, es wahrscheinlich nicht eine kluge Sache ist nicht zu tun, um meinen regex-Mangel zu korrigieren!)

+2

Nun, ich sehe kein Problem bei der Verwendung einen sehr einfachen, unkomplizierten regex hier 're.split (r '\ W + ', s) 'oder ein anderes,' re.findall (r' \ w + ', s) ' –

+0

oder einfach s.split() bekommt dich [' hallo, ',' mein ',' name ',' ist ',' Joseph! ',' Haha ',' Hallo! '], die du ganz einfach reparieren kannst. Oder an Stelle ("!", "") .split, die ['Hallo', 'mein', 'Name', 'ist', 'Joseph', 'Haha', 'Hallo'] gibt –

+0

Ja Es gibt wahrscheinlich ein paar Möglichkeiten, dies zu tun. Wird es lesbarer oder besser funktionieren, wenn Regex nicht verwendet wird? Wahrscheinlich nicht. –

Antwort

1

Ich persönlich denke, es angemessen ist einfach und unkompliziert Regexes für solche einfache Aufgaben zu verwenden.

Vergleichen eine itertools und re Lösungen:

import itertools, re 
s = "hello, my name is Joseph! Haha, hello!" 
print(["".join(x) for _, x in itertools.groupby(s, key=str.isalnum)][0::2]) 
print(re.findall(r"\w+", s)) 

ein online Python demo here See.

Für mich würde ich für die Regex hier stimmen. Die \w+ stimmt mit einem oder mehreren Wortzeichen (Buchstaben, Ziffern, Unterstriche) überein, und re.findall gibt alle nicht überlappenden Vorkommen zurück.

Die itertools groupby Gruppen der Teilzeichen chunks gemäß den key der zu alphanumerischen Zeichen (str.alnum) und all geraden Token (der Nicht-Wort-Chunks in diesem konkreten Fall) gesetzt ist, werden aus dem Endergebnis mit [0::2] entfernt. Wenn eine Zeichenfolge mit einem Nicht-Wort-Zeichen beginnt, wird dies nicht funktionieren, eine Regex-Lösung ist sicherer und einfacher.

0

Ich bin immer froh, wenn jemand versucht, avoid using regex ;) Aber hier ist es wahrscheinlich das beste Werkzeug für den Job.

Sie können Ihren eigenen Parser schreiben, aber das ist viel ausführlicher:

s = "hello, my name is Joseph! Haha, hello!" 
words = [] 
lasti = 0 
lastp = False 
for i,p in enumerate (not c.isalpha() for c in s): 
    if p != lastp: 
     if p: words.append (s[lasti:i]) 
     lasti, lastp = i,p 

print (', '.join (words)) 
Verwandte Themen