2016-06-15 16 views
0

-abc1234567-abc.jpgPython, wie Inhalte in der Erfassungsgruppe von Regex ersetzen?

Ich wünsche -abc vor .jpg, zu entfernen und -abc1234567.jpg zu bekommen. Ich habe versucht re.sub(r'\d(-abc).jpg$', '', string), aber es wird auch Inhalte außerhalb der Erfassungsgruppe ersetzen, und geben Sie mir -abc123456. Ist es möglich, nur den Inhalt in der Erfassungsgruppe zu ersetzen, d. H. "-abc"?

+1

Sie könnten einen positiven Blick verwenden voraus: [ '-abc (?. = \ Jpg)'] (https://regex101.com/r/aU5kE0/1) – jonrsharpe

+0

Die Dokumentation wird Ihnen sagen, dass Sie Rückverweise verwenden können, um die Ersetzungszeichenfolge zu ersetzen. – Evert

+0

Verwenden Sie eine Erfassungsgruppe für das Muster, das Sie behalten müssen. 're (r '(\ d) -abc \ .jpg $', r '\ 1', Zeichenkette),'. –

Antwort

2

Eine Lösung besteht darin, positive Lookahead wie folgt zu verwenden.

import re 
p = re.compile(ur'(\-abc)(?=\.jpg)') 
test_str = u"-abc1234567-abc.jpg" 
subst = u"" 

result = re.sub(p, subst, test_str) 

ODER

können Sie zwei Capture-Gruppen wie folgt verwenden.

import re 
p = re.compile(ur'(\-abc)(\.jpg)') 
test_str = u"-abc1234567-abc.jpg" 
subst = r"\2" 

result = re.sub(p, subst, test_str) 
+0

'(\ -abc) (? = \. Jpg)' = '-abc (? = \. Jpg)' –

0

Wenn Sie nur in nur jpg-Dateien entfernen -abc möchten, könnten Sie verwenden:

re.sub(r"-abc\.jpg$", ".jpg", string) 

Um Ihren Code so nah wie möglich zu nutzen: Sie sollten setzen ‚()‘ um den Teil Sie möchten behalten, nicht den Teil, den Sie entfernen möchten. Verwenden Sie dann \g<NUMBER>, um diesen Teil der Zeichenfolge auszuwählen. Also:

re.sub(r'(.*)-abc(\.jpg)$', '\g<1>\g<2>', string) 
+1

Ein '.' im Muster entspricht einem beliebigen Zeichen außer einem Zeilenumbruch. Ich denke du meintest 's.replace (" - abc.jpg "," .jpg ")' –

+0

@ WiktorStribiżew, oops. Hätte "\." Sein sollen. Gut Platz! –