Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
regex/python查找并替换字符串中的特定数字_Python_Regex_Parsing_Python 2.7 - Fatal编程技术网

regex/python查找并替换字符串中的特定数字

regex/python查找并替换字符串中的特定数字,python,regex,parsing,python-2.7,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.com

我需要替换长字符串中出现的数字(角点),所有这些数字看起来都类似于:

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

我很快意识到这是行不通的,因为正则表达式从一开始就搜索,如果不匹配模式,就会失败


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

您可以在正则表达式的子部分中使用回调函数:

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 ]

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

line = '[ 17 plane_17 \ 23 25 17 99 150 248 \ noname ]'
re.sub(r'([\\|/].*\s)(?:17)(\s.*[\\|/])', r'\g<1>19\2', line)

它们是在“\\”之间还是在单个“\\”?我的第一反应是在“\'(或双精度)处拆分,称为普通的旧替换(旧,新)在结果的每一个第二个元素上,然后在“\”处将它们连接在一起。虽然不是很像python,但有兴趣看看某人是否有一个整洁的方法,它们都将在单个“\”或单个“/”。这不是一个坏主意!也将删除正则表达式…是的,将保持简单,不确定如何在同一个li中处理“\”和“/”不知道斜杠到哪里去了?谢谢你,vpekar!回调函数真的很聪明!一个问题是:如果其中有一个三位数(或更多)的数字是“17”,那么回调也会替换它。回调意味着首先运行回调,然后再运行子回调?回调得到参数s?问号是不是(非贪婪算子)有意义,因为贪婪和非贪婪之间没有决定?谢谢asermax!我也很喜欢这个单行解决方案!我的正则表达式知识显然有一些差距。谢谢!你能解释一下它的部分内容吗。sub有3个参数:旧的、新的、字符串。你可以留下第一个
r
。反向引用1在哪里?2是\2。非capt不需要使用组,更简单:
re.sub(r'([\\\\\\\\]/].\s)(17)(\s.[\\\\\\\\\]/]),r'\g19\3',行)
'[ 17 plane_17 \ 23 25 19 99 150 248 \ noname ]'