2

Python正则表达式专家!我正在尝试更改 xml 文档中的一行。原行是:

<Tag name="low"     Value="%hello%\dir"/>

我想看到的结果是:

<Tag name="low"     Value="C:\art"/>

我失败的直接尝试是:

lines = re.sub("%hello%\dir"", "C:\art"/>

这行不通。不会改变文档中的任何内容。有 % 的东西?

出于测试目的,我尝试了:

lines = re.sub("dir", "C:\art", a)

我得到:

<Tag name="low"     Value="%hello%\C:BELrt"/>

问题是 \a = BEL

我尝试了很多其他的东西,但无济于事。我该如何解决这个问题?

4

3 回答 3

0

在 Python 中,使用r文字字符串的前缀来避免转义斜杠。然后转义你的斜线以避免\d匹配数字。

lines = re.sub(r"%hello%\\dir", r"C:\\art")
于 2012-10-12T16:17:22.210 回答
0

你的问题是你有一些在正则表达式中有特定含义的字符。

\d表示任何数字。%hello%\dir那么是%hello%[0-9]ir

您需要转义这些斜杠/使用原始字符串来解决这个问题:

a = '''<Tag name="low" Value="%hello%\dir"/>'''
lines = re.sub(r"%hello%\\dir", r"C:\\art", a)
print(lines) #<Tag name="low"     Value="C:\\art"/>
于 2012-10-12T16:18:45.003 回答
0

这是一个很好的问题。它同时显示了文本表示的三个问题:

  • '\a'Python 字符串文字是单个 BELL 字符。

    要在 Python 源代码中输入反斜杠后跟字母“a”,您需要使用 raw-literals:r'\a'或转义斜杠'\\a'

  • r'\d'(两个字符)在解释为正则表达式时具有特殊含义(r'\d'表示匹配正则表达式中的数字)。

    除了 Python 字符串文字的规则之外,您还需要转义可能的正则表达式元字符。您可以re.escape(your_string)在一般情况下使用或仅使用r'\\d'or '\\\\d''\a'在该repl部分也应该被转义(在你的情况下两次:r'\\a''\\\\a'):

    >>> old, new = r'%hello%\dir', r'C:\art'
    >>> print re.sub(re.escape(old), new.encode('string-escape'), xml)
    <Tag name="low"     Value="C:\art"/>
    

    顺便说一句,在这种情况下你根本不需要正则表达式:

    >>> print xml.replace(old, new)
    <Tag name="low"     Value="C:\art"/>
    
  • 最后,XML 属性值不能包含某些也应该转义的字符,例如 , ,'&'等。'"'"<"

一般来说,您不应该使用正则表达式来操作 XML。Python 的 stdlib 具有 XML 解析器。

>>> import xml.etree.cElementTree as etree
>>> xml = r'<Tag name="low"     Value="%hello%\dir"/>'
>>> tag = etree.fromstring(xml)
>>> tag.set('Value', r"C:\art & design")
>>> etree.dump(tag)
<Tag Value="C:\art &amp; design" name="low" />
于 2012-10-12T16:54:15.887 回答