Python Regex MULTILINE选项无法正常工作?

时间:2011-08-17 18:42:28

标签: python regex replace find multiline

我正在用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的有效观点。但是,如果我保留$,正则表达式仍然不匹配。一旦我删除$。它就会再次起作用。

2 个答案:

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

(移动比赛的一部分,以便没有冲突)