Python re.sub的替换超出了需要

Python re.sub的替换超出了需要,python,regex,Python,Regex,我们有一个6个字符的字符串,需要将起始子字符串“00”替换为“a” 在第一个字符串'001234'上使用表达式^[0][0]*,我们得到了A1234的预期结果 import re # 1: Works fine foo = '001234' match = re.match(r"^[0][0][0-9]{4}$", foo) print(match.group(0)) # 001234 bar = re.sub(r"^[0][0]*", '

我们有一个6个字符的字符串,需要将起始子字符串
“00”
替换为“a”

在第一个字符串
'001234'
上使用表达式
^[0][0]*
,我们得到了
A1234
的预期结果

import re

# 1: Works fine
foo = '001234'
match = re.match(r"^[0][0][0-9]{4}$", foo)
print(match.group(0))       # 001234

bar = re.sub(r"^[0][0]*", 'A', match.group(0))
print(bar)                  # A1234
但是,第二个字符串
'000123'
更改为
A123
,而不是
A0123

# 2: Substitutes more than needed
foo = '000123'
match = re.match(r"^[0][0][0-9]{4}$", foo)
print(match.group(0))       # 000123

bar = re.sub(r"^[0][0]*", 'A', match.group(0))
print(bar)                  # A123
                            # Expects: A0123

正则表达式模式出了什么问题,我们如何修复它?

您只需要在需要替换的行的开头指定零的数量

foo = '000100'
re.sub(r'^0{2}', r'A', foo)

'A0100'

你把正则表达式误认为是globs吗
*
表示前一个字符(或组)重复0次或更多次,这并不意味着像在globs中那样“允许在此执行任何操作”。因此,
^[0][0]*
说要寻找至少以一个
0
开头并匹配所有前导零的东西(较短的拼写应该是
^0+
)。如果你只有一个字符,例如
0
,你可以在正则表达式中将其写成
0
,而不是使用字符类,例如
[0]
为了简单起见为什么使用
r'A'
而不是
'A'
?@Athenawise:在这种情况下,这并不重要,但在正则表达式模式和替换中使用原始字符串是最安全的,因此反斜杠不会被无意中忽略或误解。当没有反斜杠时,这是不必要的,但它会养成良好的习惯。