文字列の部分一致・検索
部分一致する文字列の存在を調べる
文字列Aの中に文字列Bが含まれるかどうかは in で調べることができる。この辺りはPythonはラクに書ける※。
# coding: UTF-8 str = "すももも桃も桃のうち" print("すもも" in str) # True
※例えばC言語ではstrstr関数を使うなどして自分で文字列検索する関数を作る必要があり面倒。
※日本語をプログラム中で扱う場合には「# coding: UTF-8」などと指定する(Python3系ではデフォルトなので記載する必要は無い)。
部分一致する文字列の個数を調べる
文字列Aの中に文字列Bが何個含まれるかは count関数 で調べることができる。
#部分一致する文字列の個数を調べる # coding: UTF-8 str = "すももも桃も桃のうち" print(str.count("も")) # 4 print(str.count("桃")) # 2
次のようにすれば数値の中に何個の整数が含まれるかを調べることもできる。
num1 = 123456789 num2 = 123456789 num = str(num1 * num2) print(num) # 15241578750190521 print(num.count("1")) # 4 print(num.count("2")) # 2
なお、count関数に文字列型でない引数を渡すとエラーを吐くので注意。
部分一致する文字列の位置を調べる
文字列Aの中のどの位置に文字列Bが含まれるかは find関数 で調べることができる。該当する文字列Bが含まれない場合、find関数は-1を返す。
#部分一致する文字列の位置を調べる num = str(123456789 * 123456789) print(num) # 15241578750190521 print(num.find("1")) # 0 print(num.find("1", 3)) # 4 print(num.find("1", 5, 10)) # -1
※find関数の第2引数に整数値$n$を渡すと、左から$n$番目以降の位置を検索する。さらに第3引数に整数値$m$を渡すと、左から$n$番目~$m$番目の範囲で該当する位置を検索する。rfind関数は逆に右側から検索する。
また、reモジュールで正規表現を用いて検索することも可能。
import re num = str(123456789 * 123456789) print(num) # 15241578750190521 print(re.search("2",num)) # <re.Match object; span=(2, 3), match='2'> print(re.findall("2",num)) # ['2', '2']
find関数は該当する文字列が複数個存在していても最初(一番左側)の位置しか返さない。すべての位置を検索したい場合は、以下のようにwhile文とfind関数を組み合わせる。
#部分一致するすべての文字列の位置を調べる num = str(123456789 * 123456789) i = 0 search = "15" while i < len(num): if num.find(search,i) < 0: break i = num.find(search,i) print(i) i += 1 # 0 # 4
この例では「15241578750190521」という数字の中に「15」が登場する位置(0番目、4番目)をすべて検索している。
以下のようにリスト化すれば、さらに使い勝手が良いかもしれない。以下は日本国憲法前文に「国民」という単語がどこに何個含まれているかを調べるコード。
#検索でヒットした文字列の位置をリスト化 # coding: UTF-8 Preamble = "日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めている国際社会において、名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。" i = 0 search = "国民" strlist = [] while i < len(Preamble): if Preamble.find(search,i) < 0: break i = Preamble.find(search,i) strlist.append(i) i += 1 print(strlist) # [2, 47, 126, 157, 180, 192, 211, 287, 338, 450, 605] print(len(strlist)) # 11
※日本語をプログラム中で扱う場合には「# coding: UTF-8」などと指定する。