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

良い質問です。テキスト表現に関する 3 つの問題を一度に示します。

  • '\a'Python 文字列リテラルは単一の BELL 文字です。

    Python ソース コードでバックスラッシュの後に文字 'a' を入力するには、raw-literals: を使用するかr'\a'、スラッシュをエスケープする必要があります'\\a'

  • r'\d'(2 文字) は、正規表現として解釈されると特別な意味を持ちます (正規表現r'\d'の数字に一致することを意味します)。

    Python 文字列リテラルのルールに加えて、正規表現のメタ文字をエスケープする必要もあります。re.escape(your_string)一般的なケースまたは単にr'\\d'またはを使用できます'\\\\d'。部分もエスケープする必要があります(あなたの場合は2回:'\a'または):replr'\\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 に答える
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

Python ではr、リテラル文字列にプレフィックスを使用して、スラッシュをエスケープする必要がないようにします。\d次に、数字の一致を避けるためにスラッシュをエスケープします。

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