用Python修改*.RC文件(涉及正则表达式)

1 投票
2 回答
1078 浏览
提问于 2025-04-16 05:57

我需要做的是解析我项目中的资源文件,并更改它们的版本号。我有一个可以工作的JS脚本,但我想用Python来实现。

所以,问题出在使用re.sub这个函数上:

version = "2,3,4,5"
modified_str = re.sub(r"(/FILEVERSION )\d+,\d+,\d+,\d+(\s)/g", version, str_text)

我明白因为使用了捕获组,我的代码是不正确的。我尝试做了一些类似的事情:

modified_str = re.sub(r"(/FILEVERSION )(\d+,\d+,\d+,\d+)(\s)/g", r"2,3,4,5\2", str_text)

但还是没有效果。请帮帮我!

2 个回答

4

我想简单总结一下(可能对某些人有帮助):

我需要修改*.rc文件中的4行代码,比如:

FILEVERSION 6,0,20,163
PRODUCTVERSION 6,0,20,163
...
VALUE "FileVersion", "6, 0, 20, 163"
VALUE "ProductVersion", "6, 0, 20, 163"

前两行我用了Frederic Hamidi提供的正则表达式(非常感谢)。最后两行我写了另一个:

regex_2 = re.compile(r"\b(VALUE\s*\"FileVersion\",\s*\"|VALUE\s*\"ProductVersion\",\s*\").*?(\")", re.MULTILINE)

还有:

pass_1 = re.sub(regex_1, r"\1 " + v, source_text)
v = re.sub(",", ", ", v) #replacing "x,y,v,z" with "x, y, v, z"
pass_2 = re.sub(regex_2, r"\g<1>" + v + r"\2", pass_1)

谢谢大家。

4

在Python中,写多行的正则表达式不是这么做的。你需要用一个叫做 MULTILINE 的标志来编译正则表达式:

regex = re.compile(r"\bFILEVERSION \d+,\d+,\d+,\d+\b", re.MULTILINE)

另外,因为你在使用 re.sub(),如果你在替换字符串中没有再次指定 FILEVERSION,那么这个部分会消失:

version = "FILEVERSION 2,3,4,5"
modified_str = re.sub(regex, version, str_text)

如果想匹配其他东西,可以引入一个 捕获组,并使用 选择

regex = re.compile(r"\b(FILEVERSION|FileVersion|PRODUCTVERSION|ProductVersion) \d+,\d+,\d+,\d+\b", re.MULTILINE)

然后你可以通过反向引用 \1 将捕获到的内容放入替换字符串中:

version = r"\1 2,3,4,5"
modified_str = re.sub(regex, version, str_text)

撰写回答