使用正则表达式/ python 在字符串中查找并替换特定数字
我需要在一个比较长的字符串中替换一些数字(角落),这些数字看起来都差不多,像这样:
[ 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)
但我很快意识到这样做不行,因为正则表达式是从行的开头开始搜索的,如果不匹配模式就会失败。
我觉得应该还有其他聪明的方法可以做到这一点,但我不知道.. 有什么建议吗?
2 个回答
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 ]'
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 ]