2016-12-26 8 views
0

私はPythonのre.subとformatの機能を使って文字列の一部を検索して置換しようとしています。 は、私のようなすべてのテキストが欲しい「ESO \ D + - \ D +」の形式で交換する 'ESO \ D {3} - \ dの{3}' 先行ゼロ使用して正規表現での文字列置換が期待通りに機能しない

私はこれが働くだろうと思った

re.sub(r"ESO (\d+)-(\d+)" ,"ESO {:0>3}-{:0>3}".format(r"\1",r"\2"), line) 

しかし、私は奇妙な結果を得る:

'ESO 409から22には、' 'ESO 0409から022'

'ESO 539から4' が 'ESO 0539から04'

なりなり実際には私はエラーを見ることはできません私は、正しい結果を得る2つの操作を使用します。

>>> ricerca = re.search(r"ESO (\d+)-(\d+)","ESO 409-22") 
>>> print("ESO {:0>3}-{:0>3}".format(ricerca.group(1),ricerca.group(2))) 
ESO 409-022 

答えて

1
"ESO {:0>3}-{:0>3}".format(r"\1",r"\2") 

は同じに評価されます。

r"ESO 0\1-0\2" 

し、グループの置換が正常に進行するので、それだけで目の前に0を置きます数字。

最後のコードサンプルは、この問題を解決する非常に賢明な方法です。 re.subを本当に使用する必要がある場合は、代替として関数を渡します。

>>> import re 
>>> line = 'ESO 409-22' 
>>> re.sub(r"ESO (\d+)-(\d+)", lambda match: "ESO {:0>3}-{:0>3}".format(*match.groups()), line) 
'ESO 409-022' 
>>> help(re.sub) 
Help on function sub in module re: 

sub(pattern, repl, string, count=0, flags=0) 
    Return the string obtained by replacing the leftmost 
    non-overlapping occurrences of the pattern in string by the 
    replacement repl. repl can be either a string or a callable; 
    if a string, backslash escapes in it are processed. If it is 
    a callable, it's passed the match object and must return 
    a replacement string to be used. 
+0

なぜ 're.sub'を使用する必要がありますか?これは課題/宿題ですか? –

+0

とにかく、文字列の代わりに関数を置換文字として渡して、その内部で書式設定を行ってみてください。 –

+0

おかげで、私は「ricerca = re.search( - 、 "ESO 409から22" R "(\ D +)ESO(\ D +)" を)やりましたか?そしてその後、「re.sub( "ESO(" + ricerca.group(1)+ ") - (" + ricerca.group(2)+ ")"、 "ESO {:> 3 0} - {:> 3 0 } "形式(ricerca.group(1)、ricerca.group(2))、" ESO 409-22 ") 'は動作しません –

関連する問題