regex / python用于查找和替换字符串中的特定数字

时间:2013-03-11 14:09:54

标签: python regex parsing python-2.7

我需要替换在更长的字符串中出现的数字(角落),这些数字看起来与此类似:

[ 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 个答案:

答案 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)

除了v​​pekar回答之外,您还可以在替换字符串上使用模式的反向引用,这样您就可以尝试匹配/\之间的所有内容,并使用新数字重新创建字符串,反向引用:

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