旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[Python] re.subや文字列周りの小ネタx3

2010年2月20日

正規表現やstring周りで微妙にハマったネタを少々。

re.subの第2引数は単なる文字列じゃない

以下は「1つの半角エスケープ文字を2つに置換」という意図のコードですが

>>> import re
>>> re.sub(u"\\\\", u"\\\\", u"\\")
u'\\'

期待通りに動いてくれませんでした。

で、結論としては、こう書く必要がありました↓

>>> import re
>>> re.sub(u"\\\\", u"\\\\\\\\", u"\\")
u'\\\\'

理由は、第2引数も特殊な記法で解釈される文字列で、
2文字のエスケープ文字を1文字に解釈していたためでした。
(第1引数が、正規表現を表す特殊記法の文字列であるように)

・・・と、とにかく “\” がややこしいので
伝わってなかったらすみません。

マニュアル: reモジュール – 4.2.3 モジュール コンテンツ
のsubメソッドの部分

raw宣言でも末尾 \ はダメ

>>> r'\a' # OKの例
'\a'
>>> r'a\' # NGの例
File "<stdin>", line 1
r'a\'
^
SyntaxError: EOL while scanning single-quoted string

なんでこうなってるのかは不明ですけど、
rawでもそうじゃなくても、末尾に\を入れるとその後改行できるので、
その関係かな?と思っている。

マニュアル: チュートリアル – 3.1.2 文字列

リテラル同士だと + 無しで連結可能

>>> "str" "ing"
'string'
>>> "str".upper() "ing"
File "<stdin>", line 1
"str".upper() "ing"
^
SyntaxError: invalid syntax

リテラル同士じゃないと無理なので、使いどころは不明

マニュアル: チュートリアル – 3.1.2 文字列

以上

今月はコーディング量が多いから、細かいネタが増えてブログが書き易い!