2017-02-21 11 views
3
私は数自体に文字列内のすべての番号を交換する必要が

の間の文字列ではなく、引用符の間に挿入番号:パイソン - 引用符

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

結果:

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

私は、私が使用を使用することができます知っています文字列内のすべての数字を別の文字列に置き換える正規表現:

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

しかし、これは私に:

マッチした番号自体を置き換える方法は変更されましたか?あなたがそうのようなあなたの番号をキャプチャする必要が

+1

str'が構築されている 'としてFYIあなたが変数として' str'を使用しないでくださいPythonのデータ型です。 –

答えて

5

\1構文を使用して、一致するグループを参照することができます。

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

注バックスラッシュをエスケープすることを避けるために、生の文字列(R接頭辞)を使用する - あなたにも一致するパターンの生の文字列を使用しなければならない、そうでなければ\dエスケープとして解釈することができます将来は。

さらに、パターン(\d+)は、1桁ではなく、行内の任意の桁数に一致します。これがなければ、This is number "1" and this is number "2""2"のような文字列が生成されます。

1

あなたが使用することができます置換パターンの以前に一致したコンテンツへの逆参照。構文は\g<Number>です。ここで、Numberはキャプチャされたグループの番号です。一致する場合は0になります。

使用すると、1つはなく番号で番号として連続した数字を引用したいと、あなたがパターンとして\d+を使用する必要があるだけでなく、\d

全コード:

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)) 

http://ideone.com/x5uLte

0

を参照してください。これは次のようになります:

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

strを変数として使用しないようにしてください。strは、Pythonの組み込み型stringです。

+1

'\ d'を介して' [0-9] 'を使うのに利点はありますか? – asongtoruin

+0

@アソルトトルン彼らは私が信じているのと同じです。私はより多くのコントロールがあるので、[0-9]が好きです。これは '[a-z]'のような文字の範囲を指定する方法も示しています –

0

あなたも、この単純な何かのための正規表現を必要としない

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

、これを試してみてください:

>>> 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"'