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