2017-02-21 3 views
3

ich jede Zahl in einem String mit der Nummer selbst ersetzen, müssen aber in Anführungszeichen:Python - Legen Sie Zahlen in Zeichenfolge in Anführungszeichen

str = 'This is number 1 and this is number 22' 

Ergebnis:

str= 'This is number "1" and this is number "22"' 

Ich weiß, dass ich Gebrauch verwenden können

str = re.sub("\d", "x", str) 

aber das würde mir: diese regex jede Zahl in einer Zeichenfolge durch eine andere Zeichenfolge ersetzen

str= 'This is number x and this is number xx' 

Wie ersetzt man mit der angepassten Zahl selbst geändert?

+1

FYI sollten Sie nie 'str' als Variable verwenden als' str' ein gebaut im Python-Datentyp. –

Antwort

5

Sie können das \1 Konstrukt verwenden, um auf übereinstimmende Gruppen zu verweisen.

>>> re.sub(r"(\d+)", r'"\1"', "This is number 1 and this is number 22") 
'This is number "1" and this is number "22"' 

Beachten Sie die Verwendung von rohen Strings (mit r Präfix) zu vermeiden, den Backslash zu entkommen - sollten Sie mit einem rohen String für das Muster als auch übereinstimmen, da sonst die \d als Flucht gedeutet werden kann in der Zukunft.

Darüber hinaus entspricht das Muster (\d+) einer beliebigen Anzahl von Ziffern in einer Zeile, anstatt nur einer Ziffer - ohne diese würde eine Zeichenfolge wie This is number "1" and this is number "2""2" erzeugt werden.

1

Sie können ein verwenden Rückverweis auf den zuvor übereinstimmenden Inhalt im Ersetzungsmuster. Die Syntax lautet \g<Number>, wobei Nummer die Nummer der erfassten Gruppe oder 0 für die gesamte Übereinstimmung ist.

Wie Sie zusammenhängende Zahlen als ein und nicht die Nummer von Nummer zitieren wollen, müssen Sie \d+ als Muster verwenden, nicht nur \d

Voll Code:

import re 
str = 'This is number 1 and this is number 22' 
pat = r'\d+' 
repl = r'"\g<0>"' 
print(re.sub(pat, repl, str)) 

Siehe http://ideone.com/x5uLte

0

Dies wird tun:

s = re.sub("([0-9]+)",r'"\1"' , s) 

Auch vermeiden Sie bitte str als Variable wie str ist ein eingebauter Typ von string in Python.

+1

hat es einen Vorteil, '[0-9] 'over' \ d' zu verwenden? – asongtoruin

+0

@asongtoruin sie sind identisch, glaube ich. Ich mag '[0-9]', da ich mehr Kontrolle habe. Dies zeigt auch, wie der Bereich von Zeichen wie '[a-z]' spezifiziert wird –

0

die Sie interessieren,

import re 
str = 'This is number 1 and this is number 22' 
for s in str.split(): 
    if s.isdigit(): 
     str=re.sub(s, '"'+s+'"', str) 
print str 
1

Sie brauchen nicht einmal reguläre Ausdrücke für etwas so einfach:

>>> words = 'This is number 1 and this is number 22' 
>>> " ".join('"{}"'.format(x) if x.isdigit() else x for x in words.split()) 
'This is number "1" and this is number "22"' 
Verwandte Themen