2017-09-18 2 views
0

Ich habe ein spezielles Format für die Codierung, und ich möchte eine Regex, die die codierte Information extrahiert. Ich habe ':' als Sonderzeichen, das verschiedene 'Informationsblöcke' trennt. Zum Beispiel:Regex-Übereinstimmung, alle Gruppen durch Trennzeichen getrennt?

s = 'P:1:a:3:test_data' 

Sollte Split erhalten:

['P','1','a','3','test_data'] 

kann ich verwenden:

s.split(':') 

Allerdings kann ich eine Single ':' als auch codiert werden (es wird niemals mehr als 1 ':' zusammen gruppiert, so dass es keine Zweideutigkeit gibt). So zum Beispiel:

s = 'P:1:::3:test_data' 

Sollte geben:

['P','1',':','3','test_data'] 

Mit split (':') scheitert hier:

['P', '1', '', '', '3', 'test_data'] 

Was ist der beste Weg, das erfassen ':'? Ich bin nicht sehr stark mit Regexen, ich weiß, Regex-Gruppen können mindestens ein Zeichen mit '* +' übereinstimmen, aber ich bin sehr verwirrt darüber, wie man alles zusammensetzt. Besser noch, gibt es einen besseren Weg, es ohne Regex zu tun? Ich denke, ich kann immer über das Array iterieren, nach fortlaufenden leeren Strings suchen und sie zu ':' kombinieren. Gibt es einen eleganteren Weg?

Dank

+0

Was sollte 'P: 1 ::::: 3: test_data' in aufgeteilt werden? 'P, 1,:,:, 3, test_data' oder' P, 1, :::, 3, test_data'? – Psidom

+0

Sie können Regex mit Gruppe, ich versuchte [diese Regex] (https://regex101.com/r/pKIqak/1) und es funktioniert. –

+0

@Psidom Das wird nie auf der Grundlage der Art von Daten, mit denen ich arbeite, auftreten. Das heißt, 'P, 1,:,:, 3, test_data' ist das korrekte Verhalten. –

Antwort

0

Für Ihre speziellen Fall können Sie rund um negativen Blick verwenden den Doppelpunkt Sie auf (?<!:):|:(?!:), teilen möchten zu beschränken, das ein Doppelpunkt, der zugleich von einem anderen Doppelpunkt nicht voraus und folgt:

import re 
s = 'P:1:a:3:test_data' 
s1 = 'P:1:::3:test_data' 

re.split("(?<!:):|:(?!:)", s) 
# ['P', '1', 'a', '3', 'test_data'] 

re.split("(?<!:):|:(?!:)", s1) 
# ['P', '1', ':', '3', 'test_data'] 

eine weitere Option, die allgemeiner ist und mehr als ein : gruppiert mit re.findall und (.+?)(?::|$), mindestens ein Zeichen, bis er also träge übereinstimmen fi verarbeiten kann nds einen Doppelpunkt oder das Ende der Zeichenfolge erreicht:

re.findall('(.+?)(?::|$)', 'P:1:::3:test_data') 
# ['P', '1', ':', '3', 'test_data'] 

re.findall('(.+?)(?::|$)', 'P:1:::::3:test_data') 
# ['P', '1', ':', ':', '3', 'test_data'] 
Verwandte Themen