PHPしか知らない僕がPythonを少し触ってみたよ 〜文字列操作の捜査パート2〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
マトリックスっぽい?

この記事を三行にまとめると

前回の続き
置換や文字コードに関する部分
正規表現は次回に回します
前回文字列に関していろいろやってみましたが、今日はその続きってことで、置換や文字コードに関する部分をやってみたいと思います。

ではさっそくひあうぃーごー。



str_replace

「norm-nois.com」を「norm-nois.co.jp」に変えてみる。

//PHP
$s = 'norm-nois.com';
str_replace('com', 'co.jp', $s);

#Python
s = 'norm-nois.com'
s.replace('com', 'co.jp')



urlencode

「https://あかつき.norm-nois.com」というURLをエンコードしてみます。

//PHP
urlencode('https://あかつき.norm-nois.com');

//結果
https%3A%2F%2F%E3%81%82%E3%81%8B%E3%81%A4%E3%81%8D.norm-nois.com

#Python
import urllib.parse
urllib.parse.quote('https://あかつき.norm-nois.com')

#結果
https%3A//%E3%81%82%E3%81%8B%E3%81%A4%E3%81%8D.norm-nois.com

Pythonでは「urllib.parse」というモジュール(ライブラリの方が正しい?)を使用します。このモジュールの中に「urlencode()」という関数は用意されているのですが、PHPのurlencodeとは少し動きが違うので、ここでは「quote()」という関数を使っています。

パッと見ほとんど同じように見えますが、Pythonの方はスラッシュがそのまま残っていますね。スラッシュも変換したい場合は第二引数で設定します。

urllib.parse.quote('https://あかつき.norm-nois.com', safe = '')

「safe = ”」とするとスラッシュも含めた全部の文字が変換の対象になります。デフォルトが「safe = ‘/’」なので、省略するとスラッシュだけ除外されるってすんぽーです。

あるいは「quote_plus()」という関数を使っても良いです。

urllib.parse.quote_plus('https://あかつき.norm-nois.com')

こっちはデフォルトが「safe = ”」なので、省略してもスラッシュも変換されます。

「quote()」と「quote_plus()」の違いは空白をどう変換するかです。「quote()」だと空白は「%20」になりますが、「quote_plus()」だと「+」になります。



ちなみにPythonの「urlencode()」はGETパラメータのクエリ文字を生成する場合などに使えます。PHPで言うと「http_build_query()」に相当する感じですかね。

//PHP
http_build_query(array('page' => '2', 's' => 'python url', 'a' => 'あああ'));

#Python
import urllib.parse
urllib.parse.urlencode({'page': '2', 's': 'python url', 'a': 'あああ'})

#結果
page=2&s=python+url&a=%E3%81%82%E3%81%82%E3%81%82

変換結果はどちらも同じです。



urldecode

さっき変換したURLをデコードして「https://あかつき.norm-nois.com」に戻してみます。

//PHP
urldecode('https%3A%2F%2F%E3%81%82%E3%81%8B%E3%81%A4%E3%81%8D.norm-nois.com');

#Python
import urllib.parse
urlilb.parse.unquote('https%3A%2F%2F%E3%81%82%E3%81%8B%E3%81%A4%E3%81%8D.norm-nois.com')



mb_convert_encoding

「あかつきのお宿」をSHIFT-JISに変換してみる(元の文字コードはUTF-8とする)

//PHP
mb_convert_encoding('あかつきのお宿', 'sjis');

#Python
s = 'あかつきのお宿'
s = s.encode('sjis')
s = s.decode('sjis')

「encode()」という関数は任意の文字コードにエンコードする関数なのですが、結果がバイト文字で返ってくるので、それをさらにデコードしています。

バイト文字ってのは、えーと……あれよあれ。

論より証拠ってことで実際に見た方が早いっすね。

s = 'あかつきのお宿'
s1 = s.encode('sjis')
print(s1)
s2 = s1.decode('sjis')
print(s2)

#出力結果
s1・・・b'\x82\xa0\x82\xa9\x82\xc2\x82\xab\x82\xcc\x82\xa8\x8fh' 
s2・・・あかつきのお宿

s1のままだと何て書いてあるか分かりませんよね。コンピュータや対有機生命体コンタクト用ヒューマノイドインターフェースならこれでも十分内容を理解できるでしょうけど、僕たちのようなノーマライズヒューマンビーイングには厳しい。なのでdecode()してあげた方が良いと思います。

一行にまとめて書くこともできます。

'あかつきのお宿'.encode('sjis').decode('sjis')

正直このやり方が合ってるのかどうかいまいち自信がないのですが……良いのかな? もっとスマートなやり方も探せば出てくるかもしれません。






個人的にはstr_replaceとかhttp_build_queryとかはわりと役立つ場面が多い気がするので、それに相当するものは知っておいて損はないかなと思います。

mb_convert_encodingも、僕はCSVからデータを取り込んだり逆にCSVにデータを落とし込んだりってのを仕事で結構やるので、使用頻度が高いですね。

本当は正規表現も合わせてやろうと思ったのですが思ったよりボリューミィになりそうだったので、次回に回したいと思います。



その他のPythonを少し触ってみたの記事はこちら
前書きと索引的な
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください