3

我需要替换出现在较长字符串中的数字(角),它们看起来都类似于:

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

我很快意识到这不起作用,因为正则表达式从行首搜索,然后如果它与模式不匹配则失败。

一定有一些我不知道的聪明的方法。有什么建议吗?

4

2 回答 2

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 ]
于 2013-03-11T14:30:19.837 回答
1

除了 vpekar 答案之外,您还可以在替换字符串上使用模式的反向引用,因此您可以尝试在/or之间匹配所有内容,\并使用新数字和反向引用重新创建字符串:

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 ]'
于 2013-03-11T14:36:26.553 回答