使用正则表达式/ python 在字符串中查找并替换特定数字

3 投票
2 回答
2163 浏览
提问于 2025-04-17 18:41

我需要在一个比较长的字符串中替换一些数字(角落),这些数字看起来都差不多,像这样:

[ 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 ]

撰写回答