2017-09-30 4 views
3

Ich versuche, ein relativ einfaches Parsing-Problem zu lösen, dass Regex scheint, wie es toll wäre. Ich versuche immer noch, meinen Kopf um die Notation herum zu wickeln, also hoffte ich, einen Schubs in die richtige Richtung zu bekommen für das, was ich versuche zu tun. Die Zeichenfolge ich habe, ist in diesem Format:Regex: Zahlen zwischen Sonderzeichen (aber nicht alle Zahlen)

x = 'Testing - 12:34: I dont want this number at the end 4567:' 

Von dem, was ich habe in der Lage zu schreiben:

test = re.findall(r'\b(\d+)\b',x) 

gibt die Ausgabe von

['12', '34', '4567'] 

Es ist in der Nähe, aber nicht ganz da. Das Problem ist nicht jeder Zeichenfolge Ich werde am Ende zu scannen, so würde Ich mag eher eine Regex-Anweisung haben als nur

test = test[:2] 

Wesentlichen die Bedingung Ich versuche, ‚nehmen zu artikulieren ist die Zahlen zwischen dem - und dem zweiten:, aber sonst nichts. ' (zB 12:34 in der Form ['12', '34]). Ist das möglich? Vielen Dank!

http://regexstorm.net/tester?p=%3b%5cd%2b%3d%5cd%2b%5c%3f&i=0014%3b5010730101000033347%3d4510120173%3fAA

+0

Warum willst du nicht die letzte Nummer? –

+0

Es ist mehr eine einmalige, die in bestimmten Zeilen der Daten passiert, die ich analysiere, aber verursacht eine große Unordnung. Vielleicht ist es nicht die richtige Antwort, sich mit der Regex zu messen und ich sollte die letzten paar Elemente der Zeichenfolge für alle eliminieren, um das Problem vollständig zu vermeiden. – user6142489

+0

Meine Frage lautete eher "Was bedeutet das?": "Das Problem ist nicht jede Zeichenfolge, die ich am Ende scannen werde, also würde ich gerne eine Regex-Anweisung haben" –

Antwort

2

Dies könnte sein viel mit zwei Ausdrücke einfacher:

import re 

x = 'Testing - 12:34: I dont want this number at the end 4567:' 

rx_outer = re.compile(r'-((?:[^:]*:){2})') 
rx_inner = re.compile(r'\d+') 

numbers = [number.group(0) 
      for match in rx_outer.finditer(x) 
      for number in rx_inner.finditer(match.group(0))] 

print(numbers) 
# ['12', '34'] 

Die „äußere“ regex definiert die Scheibe zwischen dem ersten Schuss und dem zweiten Doppelpunkt während der „inneren“ regex Scannt nach Ziffern. Die Logik ist in ein Listenverständnis eingebettet.