我正在使用 Python 编写一个正则表达式,用于用 XML 节点替换部分字符串。
源字符串看起来像:
Hello REPLACE(str1) this is to replace REPLACE(str2) this is to replace
结果字符串应该是这样的:
Hello <replace name="str1"> this is to replace </replace> <replace name="str2"> this is to replace </replace>
谁能帮帮我?
请您参考如下方法:
让您的问题有点棘手的是您想要在多行字符串内部进行匹配。您需要使用 re.MULTILINE 标志才能使其正常工作。
然后,您需要匹配源字符串中的一些组,并在最终输出中使用这些组。这是可以解决您的问题的代码:
import re
s_pat = "^\s*REPLACE\(([^)]+)\)(.*)$"
pat = re.compile(s_pat, re.MULTILINE)
s_input = """\
Hello
REPLACE(str1) this is to replace
REPLACE(str2) this is to replace"""
def mksub(m):
return '<replace name="%s">%s</replace>' % m.groups()
s_output = re.sub(pat, mksub, s_input)
唯一棘手的部分是正则表达式模式。让我们详细了解一下。
^ 匹配字符串的开头。对于 re.MULTILINE,这匹配多行字符串中一行的开头;换句话说,它在字符串中的换行符之后匹配。
\s* 匹配可选的空格。
REPLACE 匹配文字字符串“REPLACE”。
\( 匹配文字字符串“(”。
( 开始一个“匹配组”。
[^)] 表示“匹配除“) 之外的任何字符”。
+ 表示“匹配前面的一个或多个模式。”
) 关闭“匹配组”。
\) 匹配文字字符串 ")"
(.*) 是另一个包含“.*”的匹配组。
$ 匹配字符串的结尾。对于 re.MULTILINE,这匹配多行字符串中一行的结尾;换句话说,它匹配字符串中的换行符。
.匹配任意字符,*表示匹配零个或多个前面的模式。因此 .* 匹配任何内容,直到行尾。
因此,我们的模式有两个“匹配组”。当您运行 re.sub() 时,它将生成一个“匹配对象”,该对象将传递给 mksub()。匹配对象有一个方法 .groups(),它以元组的形式返回匹配的子字符串,然后将其替换以生成替换文本。
编辑:您实际上不需要使用替换功能。可以在替换文本中放入特殊字符串\1,替换为匹配组1的内容。(匹配组从1开始计数,特殊匹配组0对应整个字符串\1 字符串唯一棘手的部分是 \ 在字符串中是特殊的。在普通字符串中,要获得 \,需要将两个反斜杠连续放置,如下所示:"\\1" 但是您可以使用 Python "raw string"来方便地编写替换模式。这样做你会得到这个:
导入报告
s_pat = "^\s*REPLACE\(([^)]+)\)(.*)$"
pat = re.compile(s_pat, re.MULTILINE)
s_repl = r'<replace name="\1">\2</replace>'
s_input = """\
Hello
REPLACE(str1) this is to replace
REPLACE(str2) this is to replace"""
s_output = re.sub(pat, s_repl, s_input)
