2016-10-25 3 views
2

Aus dieser ZeichenfolgeRegex: Überspringe das erste Match eines Charakters in der Gruppe?

s = 'stringalading-0.26.0-1' 

Ich mag würde 0.26.0-1 den Teil zu extrahieren. Ich kann mir verschiedene Wege, dies zu erreichen, geteilt mit oder einen regulären Ausdruck ein Muster wie diese

pattern = r'\d+\.\d+\.\d+\-\d+' 

Ich habe versucht, auch eine Gruppe von Zeichen verwendet werden, wie so mit:

pattern = r'[.\-\d]+' 

Dies gibt me:

In [30]: re.findall(pattern, s) 
Out[30]: ['-0.26.0-1'] 

So fragte ich mich: ist es möglich, das erste Vorkommen eines Zeichens in einer Gruppe, in diesem Fall das erste Auftreten von - zu überspringen?

+0

Ihre erste Regex funktioniert korrekt, aber ich würde empfehlen, hier keine Regex zu verwenden, wenn Sie nur die Zeichenfolge in 2 Teile w teilen müssen mit dem ersten Bindestrich. Siehe meine Antwort unten. –

Antwort

2

ist es möglich, das erste Vorkommen eines Zeichens in einer überspringen Gruppe, in diesem Fall das erste Auftreten von -?

NO, weil, wenn passend, verarbeitet der regex Motor aus der Zeichenfolge links nach rechts, und sobald das Übereinstimmungsmuster der Übereinstimmungspuffer gefunden wird, wird das angepasste Stück Text geschrieben. Schreiben Sie also entweder eine Regex, die nur dem entspricht, was Sie brauchen, oder bearbeiten Sie das gefundene Ergebnis, indem Sie unerwünschte Zeichen von links entfernen.

Ich denke, Sie brauchen hier keine Regex. Sie können die Zeichenfolge mit -split und die maxsplit Argument 1 gesetzt passieren, dann nur Zugriff auf das zweite Element:

s = 'stringalading-0.26.0-1' 
print(s.split("-", 1)[1]) # => '0.26.0-1' 

die auch Python demo

Siehe, deine erste Regex works well:

import re 
s = 'stringalading-0.26.0-1' 
pat = r'\d+\.\d+\.\d+-\d+' 
print(re.findall(pat, s)) # => ['0.26.0-1'] 
1

Do:

-(.*) 

und Gruppe erhalten gefangen 1.

Beispiel:

In [9]: s = 'stringalading-0.26.0-1' 

In [10]: re.search(r'-(.*)', s).group(1) 
Out[10]: '0.26.0-1' 
+0

Schöne Lösung! Gruppe 1 ist alles nach dem ersten '' '', oder? – LarsVegas

+0

@LarsVegas '. *' Ist alles nach '-' und wir haben es mit'() 'herum eingefangen. – heemayl

+0

Aber die Frage bleibt: ist es möglich, das erste Auftreten einer bestimmten Zeichenfolge in einer Gruppe wie in meinem Beispiel zu überspringen? – LarsVegas