[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 文字列
以上
今月はコーディング量が多いから、細かいネタが増えてブログが書き易い!