多次出现的文件中仅替换匹配的组

问题描述

输入: /* ABCD X 1111 */ /* Comment 1111: [[reason for comment]] */

输出 /* ABCD X 1111 # [[reason for comment]] */

使用的正则表达式regex = (?:[\/*]+\sPRQA[\s\w\,]*)(\*\/\s*\/\*\Comment[\w\,]+:)+(?:\s\[\[.*\/$)

如何使用上述正则表达式在出现多次的文件中将匹配的组替换为“#”?

我尝试使用re.sub(regex,'#\1',file.read(),re.MULTILINE),但这会将#附加到匹配的组中。

是否有一种直接的方法,而不是逐行迭代然后替换?

解决方法

您可以使用

re.sub(r'(/\*\s*ABCD[^*/]*)\*/\s*/\*\s*Comment[^*:]+:(\s*\[\[[^][]*]]\s*\*/)',r'\1#\2',file.read())

如果您确定这些子字符串仅出现在行尾,请向后添加$锚点并使用flags=re.M

re.sub(r'(/\*\s*ABCD[^*/]*)\*/\s*/\*\s*Comment[^*:]+:(\s*\[\[[^][]*]]\s*\*/)$',file.read(),flags=re.M)

请参见regex demo详细信息

  • (/\*\s*ABCD[^*/]*)-组1(\1):/*,零个或多个空格,ABCD,然后是除*以外的任何零个或多个字符和/
  • \*/\s*/\*\s*Comment[^*:]+:-*/,零个或多个空格,/,零个或多个空格,Comment,除*和{之外的一个或多个字符{1}},然后:
  • :-第2组((\s*\[\[[^][]*]]\s*\*/)):零个或多个空格\2,除[[[之外的零个或多个字符,{{ 1}},零个或多个空格,]

请参见Python demo

]]

输出:

*/