我需要替换在更长的字符串中出现的数字(角落),这些数字看起来与此类似:
[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]
我的功能将“旧”号码替换为“新”号码,例如如果那个旧的数字是17而新的是19,那么结果应该是:
[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]
请注意,只应替换\ \中的数字(这些也可以是/ /)。
为此,我尝试设置正则表达式替换,目的是避免\ \或/ /之外的数字:
newplane = re.compile(r"[^[_] (" + str(oldcorner) + ")").sub(str(newcorner), oldplane)
我很快意识到这不起作用,因为正则表达式从行的开头搜索,然后如果它与模式不匹配则失败。
必须有一些聪明的方法来做它我还不知道...有什么建议吗?
答案 0 :(得分:4)
您可以在正则表达式的子部分中使用回调函数:
import re
def callback(match):
return match.group(0).replace('17', '19')
s = "[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]"
s = re.compile(r'\\.+?\\').sub(callback, s)
print s
打印:
[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]
答案 1 :(得分:1)
除了vpekar回答之外,您还可以在替换字符串上使用模式的反向引用,这样您就可以尝试匹配/
或\
之间的所有内容,并使用新数字重新创建字符串,反向引用:
line = '[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]'
re.sub(r'([\\|/].*\s)(?:17)(\s.*[\\|/])', r'\g<1>19\2', line)
返回:
'[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]'