正则表达式替换为XML节点

YuQ*_*ang 1 python regex

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

谁能帮我?

ste*_*eha 5

是什么让你的问题有点棘手,你想要在多线字符串内匹配.你需要使用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)
Run Code Online (Sandbox Code Playgroud)

唯一棘手的部分是正则表达式模式.让我们详细看一下.

^匹配字符串的开头.使用re.MULTILINE,这匹配多行字符串中的行的开头; 换句话说,它在字符串中的换行符后立即匹配.

\s* 匹配可选的空格.

REPLACE 匹配文字字符串"REPLACE".

\( 匹配文字字符串"(".

( 开始一个"匹配组".

[^)] 意思是"匹配任何字符而不是")"".

+ 表示"匹配前述模式中的一个或多个.

) 关闭"匹配组".

\) 匹配文字字符串")"

(.*) 是包含".*"的另一个匹配组.

$匹配字符串的结尾.使用re.MULTILINE,这匹配多行字符串中的行的结尾; 换句话说,它匹配字符串中的换行符.

.匹配任何字符,并*表示匹配前面的模式中的零个或多个.因此.*匹配任何东西,直到行尾.

所以,我们的模式有两个"匹配组".当你运行re.sub()它时会产生一个"匹配对象",它将被传递给mksub().匹配对象有一个方法,.groups()它将匹配的子字符串作为元组返回,并替换为替换文本.

编辑:您实际上不需要使用替换功能.您可以将特殊字符串\1放在替换文本中,它将被匹配组1的内容替换.(匹配组计数从1开始;特殊匹配组0对应于模式匹配的整个字符串.)唯一棘手的问题\1字符串的一部分是字符串中\的特殊字符串.在普通字符串中,要获得a \,需要在行中放入两个反斜杠,如下所示:"\\1" 但是您可以使用Python"原始字符串"来方便地编写替换模式.这样做你得到这个:

进口重新

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)
Run Code Online (Sandbox Code Playgroud)