2017-02-17 11 views
-1

Ich muss einige Daten aus einer Zeichenfolge extrahieren, die Zeichenfolge ist so etwas wie fixed-string-<number>-<string>. Fixed string ist immer das Gleiche, ich muss die Nummer und ihre Zeichenfolge entfernen.Regulärer Ausdruck, um Nummer und String zu extrahieren

In Python 3.5, ich bin den nächsten regulären Ausdruck

str = 'initial-string/fixed-string-124-jeff-thompson' 
result = re.match('fixed-string-([0-9]*)-(.*)', str) 
print (result) 

Aber Ergebnis ist immer None Wert, überprüfte ich die Zeichenfolge und es ist gut ausgebildet.

Was mache ich falsch?

aktualisieren

testing = 'first-string/fixed-string-123-jeff-thompson' 
pattern = r'fixed-string-(\d+)-(.*)' 

result = re.match(pattern, testing) 

Getestet habe ich diese, und der Code gibt mir noch None.

Vielen Dank.

+4

Verwenden Sie keine 'als Variablenname str'. Ihre Regex funktioniert tatsächlich, siehe [diese Demo] (https://ideone.com/g4r2yC). Beachten Sie, dass 're.match' beim Stringstart nur nach einer Übereinstimmung sucht. –

+0

Geben Sie eine Zeichenfolge an, mit der Sie arbeiten würden. – kazemakase

Antwort

1

Sie verwenden re.match, die das Muster am Anfang anzupassen versucht (dh vom ersten Zeichen) Ihrer Zeichenfolge. Hier verhindert "initial-string /" die Übereinstimmung.

Sie können entweder "initial-string /" in Ihr Muster einfügen oder re.search verwenden, das ab einer beliebigen Position in der Zeichenfolge übereinstimmt.

Beachten Sie, dass es auch besser ist, rohe Strings (r'my string mit \ backslahes ') zu verwenden, um die potenzielle Notwendigkeit zu vermeiden, in Ihrem Muster zu entkommen.

string = 'initial-string/fixed-string-124-jeff-thompson' 
result = re.search(r'fixed-string-([0-9]*)-(.*)', str) 
result.groups() 
# ('124', 'jeff-thompson') 

oder

result = re.match(r'initial-string/fixed-string-([0-9]*)-(.*)', str) 
result.groups() 
# ('124', 'jeff-thompson') 
2

Die folgenden Werke:

> s = 'fixed-string-345-abc' 
> re.match(r'fixed-string-(\d+)-(.+)') # if num and string shouldn't be empty 
# re.match(r'fixed-string-(\d*)-(.*)') 
> m.group(1, 2) 
('345', 'abc') 
+0

In Python 3.x sind die Stenoklassen Unicode-aware. Das '\ d' passt mehr als' [0-9] '. Im Grunde genommen ist es das gleiche Regex OP, allerdings etwas weniger präzise. –

+0

Dieser Code funktioniert für mich in Python-Konsole, aber nicht in meinem Code. 're.match' gibt mir immer noch' None' zurück. –

1

Dies funktioniert auch:

import re 
s = 'fixed-string-123-456' 
result = re.findall('(?<=fixed-string-)(\d+)-(.*)', s) 
if result: 
    print (result[0]) 
#('123', '456') 

https://ideone.com/4RRwff

Verwandte Themen