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

问题描述

输入: /* 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

]]

输出:

*/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...