2017-02-03 10 views
0

ich eine Zeichenfolge abzurufen bin versucht, alle Numerik zwischen zwei anderen Saiten ignorieren mit regexRegex entfernen Numerik zwischen zwei Strings

In meinem Beispiel unten, ABC, DEF und HIJ werden immer den gleichen Wert sein, und in der gleiche Position der gesuchten Zeichenfolge, aber 123 und 456 werden immer unterschiedliche Werte und Längen haben.

Mein Beispiel String ist:

"ABC 123 456 DEF HIJ" 

Ich versuche, der mit dem Ergebnis gelassen werden:

"DEF" 

Ich kann dies durch zwei Linien tun

r'ABC (.*) HIJ' 

mit Was mich mit 123 456 DEF verlässt, wo ich dann könnte:

Es scheint, dass das möglich sein sollte, aber ich kann wirklich nicht scheinen, es herauszufinden, wenn es ist.

+0

Will Der Begriff, den Sie suchen, ist immer das vorletzte Wort auf der Linie?Nur aus Neugierde hoffe ich es ist nicht immer DEF :) –

+0

HIJ wird immer der letzte sein und ABC immer der erste – Giovanni

+0

Ich frage mich, ob du die Tatsache nutzen könntest, dass du nach dem vorletzten Wort am Ende des Satzes suchst mit etwas Kurzem kommen. –

Antwort

4

Im Regex \d+ wird 1 oder mehr Ziffern übereinstimmen (gierig).

>>> import re 
>>> s = "ABC 123 456 DEF HIJ" 
>>> pat = r'ABC \d+ \d+ (.*) HIJ' 
>>> re.findall(pat, s) 
['DEF'] 
0

Wie über den regulären Ausdruck: (aktualisiert aufgrund des ersten Kommentar)

([A-Za-z] +) \ [A-Za-z] +

$

Es wird das erste von zwei Wörtern erfassen, die durch ein Leerzeichen am Ende der Zeile getrennt sind.

import re 

s = "ABC 123123123 1231231234 DEF HIJ" 
pat = r'([A-Za-z]+)\ [A-Za-z]+$' 
a = re.findall(pat,s) 
print (a) 

gibt 'DEF'

Um mehrere Wörter in dieser Position zu erfassen Sie das Muster ändern könnte:

r'\ ([A-Za-z\ ]+)\ [A-Za-z]+$' 

für eine Eingabe von ABC 234234 46456456 DEF ZYX ​​HIJ, wird diese geben du 'DEF ZYX'.

Wenn Sie erzwingen möchten, dass die erste Zeichenfolge ABC und die letzte Zeichenfolge HIJ sein muss, dann wird die andere Antwort von den Trick tun.

+1

Werfen Sie einen Blick auf die ASCII-Tabelle und Sie werden verstehen, dass '[A-z]' nicht das ist, was Sie denken und nicht nur Buchstaben enthält. –

+0

Verdammte Interpunktion, sollte mit [A-Za-z] geklebt haben. Aktualisiert, um Ihre Eingabe zu reflektieren. Ich muss zugeben, dass ich die ASCII-Tabelle nicht betrachtet habe, seit ich "UI's" mit ALT-Codes erstellt habe. –

4

Je nach genau das, was in Ihrer Eingangsdaten festgelegt ist, können Sie versuchen, die zweite „Wort“ Extrahieren, so dass für (und ignoriert) dazwischen liegenden Ziffernfolgen mit einem Muster wie folgt aus:

foo = "ABC 123 456 DEF 456 HIJ" 
pat = r'\w+\s+[\d ]*(\w+)[\d ]*\w+' 
re.findall(pat, foo) 
['DEF'] 

Alternativ Regexps sind vielleicht nicht der einfachste Weg. Sie können eine einzelne Regexp verwenden, um alle numerischen Zeichen auszublenden, die verbleibende Zeichenfolge in Whitespace aufzuteilen und das zweite Element zu übernehmen.

+0

Anscheinend hat das Personal herausgefunden, dass Sie diese Antwort aus der Antarktis senden. Gute Arbeit bei einer guten Antwort und [vermutlich die erste] (https://twitter.com/i/web/status/827536984176476163), um einen Beitrag vom 7. Kontinent zu senden! – Mast

0

Basierend auf „ABC, DEF und HIJ wird immer der gleiche Wert sein, und in der gleichen Position der Zeichenfolge gesucht wird, sondern 123 und 456 wird immer unterschiedliche Werte und Längen“:

>>> re.sub("ABC \d+ \d+ DEF HIJ", "DEF", "foo1 ABC 12345 67890 DEF HIJ foo2") 
'foo1 DEF foo2' 
Verwandte Themen