我正在用Python编写一个简单的版本更新程序,正则表达式引擎给了我很大的麻烦。
特别是,即使使用re.MULTILINE选项,^和$也无法正确匹配。字符串匹配没有^和$,但没有其他欢乐。
如果你能发现我做错了什么,我将不胜感激。
由于
target.c
somethingsomethingsomething
NOTICE_TYPE revision[] = "A_X1_01.20.00";
somethingsomethingsomething
versionUpdate.py
fileName = "target.c"
newVersion = "01.20.01"
find = '^(\s+NOTICE_TYPE revision\[\] = "A_X1_)\d\d+\.\d\d+\.\d\d+(";)$'
replace = "\\1" + newVersion + "\\2"
file = open(fileName, "r")
fileContent = file.read()
file.close()
find_regexp = re.compile(find, re.MULTILINE)
file = open(fileName, "w")
file.write( find_regexp.sub(replace, fileContent) )
file.close()
更新:感谢John和Ethan的有效观点。但是,如果我保留$,正则表达式仍然不匹配。一旦我删除$。它就会再次起作用。
答案 0 :(得分:6)
将您的替换更改为:
replace = r'\g<1>' + newVersion + r'\2'
您遇到的问题是您的版本导致此问题:
replace = "\\101.20.01\\2"
这使得子调用混乱,因为没有字段101.从Python re module的文档:
\克LT;数&GT;使用相应的组号; \克LT 2 - ;因此 相当于\ 2,但在诸如\ g&lt; 2&gt; 0的替换中不是模糊的。 \ 20将被解释为对第20组的引用,而不是引用 到第2组,后跟文字字符'0'。
答案 1 :(得分:2)
如果您执行print replace
,您会看到问题...
replace == '\\101.20.01\2'
由于您没有第101场比赛,因此您线路的第一部分会丢失。试试这个:
newVersion = "_01.20.01"
find = r'^(\s+NOTICE_TYPE revision\[\] = "A_X1)_\d\d+\.\d\d+\.\d\d+(";)$'
replace = "\\1" + newVersion + "\\2"
(移动比赛的一部分,以便没有冲突)