目の付け所が斜め上下 (http://menotsu.blogspot.jp/ のBackup版)

「Google検索でなかなか見つからない情報を、独自視点で備忘録も兼ねて掲載」の予備サイトです。

昼休みや通勤・通学時間帯でも速度低下しにくい格安回線(MVNO)特集
 (遅い格安SIMに削られる時間を仕事にあてたら、いくら得するだろう・・・・)

■期間限定ポイントの消化にいかが? ・ギフト券店(楽天)

空きスペースを駐車場などでレンタルして小遣い稼ぎ

■お得な招待コード or 招待ページ
メルカリ:FEKMZK、ポイントサイト モッピーアメフリげん玉げっとま

免責:本記事により生じた損失について記述者は一切の責任を持てませんので、その程度の内容としてご活用下さい。出所が怪しいネット情報は新規の着眼点を得るために使うべきで、興味を持った場合は信頼できる情報源で検証して下さい。さらに、その検証結果を公開してもらえると有り難いです。なお不具合の注意喚起は公衆の不利益回避のためであって、他者を攻撃するためではありません。
本記事にはCM等の事業者の表示が含まれます。

pythonのraw文字列は文字列末尾の¥または\(バックスラッシュ)を正しく扱えない事に起因する罠 @python @注意 @windows

■■■ 罠 ■■■

末尾という言葉に油断していると以下の様な罠にはまります。

r"c:\aaa\b.txt".replace(r"\","/")
は「SyntaxError: EOL while scanning string literal」とエラーが出ます。
つまり「文法誤り:文字列の末端(")を探していたら文末(End Of Line)に来ちゃったよ」と怒られます。



下に続く・・・
スポンサードリンク


■■■ 理由 ■■■

実は「"\"」の\によって\の後ろの「"」が正規表現的にエスケープされることで、前の「"」のペアとして認識されなくなり、Python側からは文字列が「"」で閉じられていない、と認識されてしまうのです(raw文字の仕様としてオカシイと思いますが・・・)。

このように"\"の様に1文字のみの文字列も末尾が(バックスラッシュ)になるので罠にかかるのです。

よって「r"\"」を「"\"」と取り換えて

r"c:\aaa\b.txt".replace("\","/")
は「'c:/aaa/b.txt'」と正しく置換されました。


下に続く・・・
スポンサードリンク

■■■ 同様の罠■■■

ちなみに上記replaceメソッド以外にもrepr関数でも生じます。
repr("\") >> SyntaxError: EOL while scanning string literal

公式ドキュメントhttps://docs.python.org/ja/3/library/re.html?highlight=match%20start
では「ごく単純な表現以外は、全て raw 文字列を使うことを強く推奨します。」
とか書かれていますが、どうでしょうか? 私は危険な気がします。

あと、文字コードの違いでWindowsMacでも面倒な事が有るので、replaceメソッドではなく、関数re.subを使った方が良いらしいです。
https://dianxnao.com/python%EF%BC%9A%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E5%8D%8A%E8%A7%92%EF%BF%A5%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E6%96%B9%E6%B3%952%E7%A8%AE%E9%A1%9E/






(コメントされる場合はコメントの最初にjjjjと入れて下さい。無い場合はスパムとみなされてしまいます。 English comments will be welcomed. If you have any comments, please write 'jjjj' at first of your comments OR spam filters will delete your comments.)

スポンサードリンク

免責:本ブログの内容により、いかなる損失が発生しても本ブログの記述者は一切の責任を持ちませんので、その程度の内容としてご活用下さい。