2

我有一个 XML,我想在其中重命名一个标记组,如下所示:

<string>ABC</string>
<string>unknown string</string>

应该

<xyz>ABC</xyz>
<xyz>unknown string</xyz>

ABC 总是一样的,所以这没问题。但是,“未知字符串”总是不同的,但由于我需要提取此信息,我也希望在替换中保留相同的字符串。

这是我到目前为止得到的:

    import re
    #open the xml file for reading:
    file = open('path/file','r+')
    #convert to string:
    data = file.read()
    file.write(re.sub("<string>ABC</string>(\s+)<string>(.*)</string>","<xyz>ABC</xyz>[\1]<xyz>[\2]</xyz>",data))
    print (data)
    file.close()

我尝试使用捕获组,但没有正确执行。该字符串在我的 XML 中被替换为奇怪的符号。另外,它被打印了两次。我的 XML 中有未更改的版本和已更改的版本,这是我不想要的。

4

2 回答 2

3

您遇到的问题不是由于您的正则表达式模式。字符串中的反斜杠 ( \) 正在转义正在进行的字符,从而导致您看到奇怪的符号。

>>> print "hello\1world"
helloworld
>>> print r"hello\1world"
hello\1world

始终使用原始字符串表示法来定义您的 re 模式。

>>> data = """
... <string>ABC</string>
... <string>unknown string</string>
... """
>>> print re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data)

<xyz>ABC</xyz>
<xyz>unknown string</xyz>
于 2012-07-13T08:57:54.030 回答
0

为什么在替换操作中包含内容?您需要做的就是:

  • 替换<string><xyz>
  • 替换</string></xyz>

这将需要两个操作,但您的代码的意图很明确,您不需要知道是什么unknown string

于 2012-07-13T08:41:35.227 回答