正则表达式下的字符串替换未按预期工作

时间:2016-12-26 14:31:32

标签: python python-3.x

我正在尝试使用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

1 个答案:

答案 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.