環境設定
プログラム作成
文字列
tkinter
|
Python文字列
文字列処理の方法を説明します.
目次
文字列とは
Python では,文字列やはシングルクォートあるいはダブルクォートで囲むことで,文字列になります.演算子「*」と「+」をオーバーロードしていますので.次のような演算が可能です.
文字列の和と積 |
実行結果 |
#!/usr/bin/python3
a = 'abc-';
b = 'XYZ';
print(a+b);
print(3*a);
|
abc-XYZ
abc-abc-abc-
|
文字列のメソッド
文字列と数値の変換
文字列から数値へ
整数型
整数の文字列を整数の数値に変換する場合,関数「int("文字列", 基数)」を使います.基数の範囲は 0 &mdash 36 で,デフォルトは 10 です.
文字列を整数に変換するプログラム |
実行結果 |
#!/usr/bin/python3
str_a = "1111"
str_b = "FF"
a02 = int(str_a, 2)
a08 = int(str_a, 8)
a10 = int(str_a)
a16 = int(str_a, 16)
b16 = int(str_b, 16)
print(a02, "\t", a08, "\t", a10, "\t", a16)
print(b16)
|
15 585 1111 4369
255
|
浮動小数点型
浮動小数点を表す文字列を浮動小数点の数値に変換する場合,関数「float("文字列")」を使います.
文字列を浮動小数点数に変換するプログラム |
実行結果 |
#!/usr/bin/python3
str_a = "123"
str_b = "12345.6789"
str_c = "2.997e+8"
str_abc = str_a + str_b + str_c
a = float(str_a)
b = float(str_b)
c = float(str_c)
d = float("1.602176565e-19")
abc = a + b + c
print(str_abc)
print(a)
print(b)
print(c)
print(d)
print(abc)
|
12312345.67892.997e+8
123.0
12345.6789
299700000.0
1.602176565e-19
299712468.6789
|
複素数型
複素数を表す文字列を数値の複素数に変換するには,関数「complex("文字列")」を使います.
文字列を浮動小数点数に変換するプログラム |
実行結果 |
#!/usr/bin/python3
str_a = "12.34+56.78j"
str_b = "11.11+22.22j"
str_abc = str_a + str_b
a = complex(str_a)
b = complex(str_b)
ab = a + b
print(str_abc)
print(a)
print(b)
print(ab)
|
12.34+56.78j11.11+22.22j
(12.34+56.78j)
(11.11+22.22j)
(23.45+79j)
|
数値から文字列へ
プレフィックス
文字列の前に,プレフィックス (f, r, u, b) を付けることで.文字列リテラルを変えることができます.f は format の意味で,中括弧{} の中の式を文字列に置換します.r は raw の意味で,文字列リテラルのスケープコードが無視されます.b は byte を表します.u は unicode を表します.b や u を使うことはないです.これらののプレフィックスは,大文字で動作します.
正規表現 (regular expression)
プログラムでは文字列をパターンで表現しなくてはならない場合があります.例えば,私のローマ字で書かれた私の名前,「Masashi Yamamoto」や「MASASHI YAMAMOTO」,「masashi yamamoto」を「山本昌志」と変換する場合です.このような場合,ローマ字で書かれた 3 つの表現を同じものとして取り扱わなくてはなりません.通常はの処理では文字列のパターンを調べ,対象の文字列(ここではローマ字で書かれた 3 つの名前)を抽出します.この文字列のパターンを表す表記方法が「正規表現 (regular expression)」です.これは文字列の置換の例ですが,この他にも (1)データの正当性のチェック,(2) 文字列の検索,(3) 文字列の分割のパターンにつ変わることが多いです.正規表現は大変便利なので,さまざまなプログラミング言語で使うことができます.
Python でも re モジュールを使うことで,正規表現を使った処理が可能です.ここでは,その具体的な方法を示します.
Python の表現
Python の正規表現の形式を以下の表に示します.
Python の re モジュールの正規表現
正規表現 |
文字列パターン |
[abcXYZ] |
a,b,c,X,Y,Zのどれかひとつ*1 |
[a-z] |
a〜zのどれかひとつ*2 |
[C-W5-7] |
C〜W,あるいは5〜7のどれかひとつ |
[^ab] |
'a'と'b'以外にマッチ.ブラケット直後の ^ は否定*3 |
hoge | fuga |
hoge あるいは fuga のいずれか |
. |
改行文字(\n)以外の任意の1文字 |
\s と \S |
\s は空白文字*4にマッチ.\Sはその否定. |
\d と \D |
\d は0〜9の数字にマッチ([0-9]と同じ).\D はその否定. |
\w と \W |
英文字と英数字,下線([a-zA-Z0-9_])]にマッチ.\W はその否定. |
\b と \B |
\b は単語境界,\B は単語境界ではない. |
^ |
直後が文字列の先頭 |
$ |
直前が文字列の末尾 |
* |
直前の文字がゼロ個以上 |
+ |
直前の文字が1個以上 |
? |
直前の文字が0個または1個 |
最小の文字列にマッチ*5 |
{3,8} |
直前の文字が3個以上,8個以下 |
{6} |
直前の文字が6個 |
{7,} |
直前の文字が7個以上 |
{,5} |
直前の文字が5個以下 |
(パターン) |
「\整数」で括弧内の文字列を参照できる*6 |
注意事項
- *1 文字列クラスで文字列中の「]」にマッチさせる場合には,合には「\]」とエスケープします.
- *2 「-」が先頭にある場合は,リテラルになり範囲指定の意味は失われます.文字列中の「-」を文字列クラスで表現する場合には「\-」とエスケープします.
- *3 「^」が先頭にない場合は,リテラルになり否定の意味は失われます.文字列中の「^」を文字列クラスで表現する場合には「\^」とエスケープします.
- *4 空白文字とは,「半角スペース, Tab(\t),改行(\n),リターン(\t),, 改ページ(\f),垂直タブ(\v)」のこと.
- *5 不定個数文字の正規表現では,最も多くの文字列にマッチします.例えば「go+」とした場合,文字列「gooooool」の「goooooo」の部分にマッチします.最小の文字列にマッチさせたい場合には,「?」を付けます.「go+?」とすると「go」にマッチします.これが役に立つ例を示しましょう.「<span.+>」とした場合,文字列「<span class="hoge">」にはマッチしません.「.+」が「>」までマッチするからです.「<span.+?>」とすれば 文字列「<span class="hoge">」にマッチします.最小文字列にマッチは,「*?」, 「+?」, 「??」, 「{m, n}?」で使用可能.
- *6 「xx\(.\)yy\([a-z]\)zz\2\1」は,「xx9yyazza9」や「xxByykzzkB」にマッチする.\1 は最初の括弧内の . に対応した文字列(ここでは文字),\2は次の括弧内の文字列になります.
- 正規表現の特殊文字は,「.」や「^」,「$」,「*」,「+」,「?」と「{」,「}」と「[」,「]」と「\」,「|」,「(」,「)」です.通常,これらを文字として使う場合,エスケープ(文字の前に\をつける)しなくてはなりません.ただし,文字クラスを表す角括弧「[…]」内に書くときは,以下の場合を除きそのまま書けます(エスケープ不要,リテラルでOK).文字クラスの場合「-」と「^」に示したように,エスケープが必要な場合があります.
- 優先順位 演算子の優先順は,(1)括弧「()」,(2)繰り返しを表す「*,+,?,{3,8}」,(3)並び,位置指定,(4)または「|」です.
re モジュールによる文字列処理の方法
関数(メソッド)
正規表現モジュール(re)の関数(メソッド)の動作
設定 |
機能 |
戻り値 |
re.compile(pattern, flags=0) |
正規表現パターンを正規表現オブジェクトにコンパイル |
コンパイルしたオブジェクト |
re.search(pattern, string, flags=0) |
文字列の任意の位置で,マッチするパターンを捜す. |
マッチ: マッチオブジェクト マッチしない: None |
re.match(pattern, string, flags=0) |
文字列の先頭で,マッチするパターンを捜す. |
マッチ: マッチオブジェクト マッチしない: None |
re.split(pattern, string, maxsplit=0, flags=0) |
文字列をパターンで,maxsplit での指定回数分割する.maxsplit=0 の場合には可能な限り分割する. |
分割された文字列のリスト |
re.findall(pattern, string, flags=0) |
文字レス角全てのマッチパターンの検索 |
すべてのマッチを文字列のリスト |
re.finditer(pattern, string, flags=0) |
マッチオブジェクトを生成するするイテレータの作成 |
イタレータ |
re.sub(pattern, repl, string, flags=0) |
マッチしたパターンを文字列 repl で置換.cont(整数) は置換数の設定で,ゼロの場合は無制限. |
置換された文字列 |
re.subn(pattern, repl, string, flags=0) |
マッチしたパターンを文字列 repl で置換.cont(整数) は置換数の設定で,ゼロの場合は無制限. |
タプル「(置換された文字列, 置換数)」 |
re.escape(string) |
英数字以外をエスケープする. |
文字列 |
re.purge() |
正規表現のキャッシュをクリア |
|
フラグ設定
複数のフラグを設定する場合には,「re.A|re.A」とします.
Python の正規表現モジュール(re)の設定
設定 |
内容 |
re.A あるいは re.ASCII |
文字列が ASCII として,\b, \B, \x, \S, \w, \W を取り扱います. |
re.I あるいは re.IGNORECASE |
英文字の大文字/小文字を区別せずにマッチングを行います.文字クラス [A-Z] とした場合でも小文字にもマッチします. |
re.M あるいは MULTILINE |
「^」は文字列の先頭と各行の直後にマッチ,「$」は文字列の末尾と各行の末尾にマッチします.デフォルトは,それぞれ文字列の先頭と末尾のみにマッチです. |
re.S あるいは re.DOTALL |
ドット「.」が改行も含めマッチします. |
re.X あるいは re.VERBOSE |
パターン内の空白の無視とコメントの導入により,パターンを読みやすくします.パターン内の空白を無視します.さらに,パターン内の文字「#」はコメント文の開始として取り扱います.そこから行末までの文字列を無視します.ただし,文字クラス内あるいはエスケープされた場合には,このフラグの影響を受けません. |
ページ作成情報
参考資料
更新履歴
|