Skip to main content
 首页 » 编程设计

python之用 XML 节点替换的正则表达式

2025年05月04日11mayingbao

我正在使用 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)