【问题标题】:Find/replace an URL in document using Python regex使用 Python 正则表达式查找/替换文档中的 URL
【发布时间】:2012-10-12 16:14:55
【问题描述】:

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.

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

【问题讨论】:

  • 您确定需要正则表达式吗?看起来您可以通过简单的 replace() 方法调用来解决问题?

标签: python xml regex


【解决方案1】:

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

\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"/>

【讨论】:

    【解决方案2】:

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

    lines = re.sub(r"%hello%\\dir", r"C:\\art")
    

    【讨论】:

    • r'\d' 表示匹配正则表达式中的数字
    • repl 部分中的r'\a' 也应该被转义。还有/&gt; -> )
    【解决方案3】:

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

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

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

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

      除了 Python 字符串文字的规则之外,您还需要转义可能的正则表达式元字符。在一般情况下,您可以使用re.escape(your_string),也可以只使用r'\\d''\\\\d'repl 部分中的 '\a' 也应转义(在您的情况下两次: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 attribute value can't contain certain characters也应该被转义,例如'&amp;''"'"&lt;"

    一般来说,您不应该使用正则表达式来操作 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" />
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 2012-06-06
    • 2015-04-27
    • 1970-01-01
    • 2023-03-21
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多