我正在尝试使用Python的re.sub和format功能搜索和替换部分字符串。 我希望使用前导零以'ESO \ d {3} - \ d {3}'格式替换所有文本,例如'ESO \ d + - \ d +“。
我认为这样可行:
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'
我看不到错误,事实上如果我使用两个操作,我得到了正确的结果:
>>> 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
答案 0 :(得分: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.