2016-12-26 36 views
0

我试图用Python的re.sub和格式化功能来搜索和替换部分字符串。 我要像所有文字“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'

实际上,我看不到错误我用两个操作我得到正确的结果:

>>> 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(r“ESO(\ d +) - (\ d +)”,“ESO 409-22”)?然后're.sub(“ESO(”+ ricerca.group(1)+“) - (”+ ricerca.group(2)+“)”,“ESO {:0> 3} - {:0> 3 }“。格式(ricerca.group(1),ricerca.group(2)),”ESO 409-22“)'now'works –

相关问题