時間のない人向け
英字のみで構成された文字列をpythonで判定したい場合
下記のようにre.match(“条件”,text)を使うことで判定できます.
import re
text_list = ["英単語を含むtext", "only alphabet text", "日本語のみの文章", "alphabet","カタカナ","文字列", "1234"]
#英字のみで構成されている場合をマッチさせる場合(アルファベットのみの場合と空白,カンマ,ピリオドが含まれる場合を抽出)
print("re.match()による英字のみのマッチ判定")
for text in text_list:
if re.match("[a-zA-Z\s\.\,]+", text):
print("True: ", text)
else:
print("False:", text)
re.match()による英字のみのマッチ判定
False: 英単語を含むtext
True: only alphabet text
False: 日本語のみの文章
True: alphabet
False: カタカナ
False: 文字列
False: 1234
英字を含む文字列をpythonで判定したい場合
下記のようにre.match(“条件”,text)を使うことで判定できます.
import re
text_list = ["英単語を含むtext", "only alphabet text", "日本語のみの文章", "alphabet","カタカナ","文字列", "1234"]
#英字を含む文章に対して判定をしたい場合
print("re.match()による英字を含む文章のマッチ判定")
for text in text_list:
if re.match(".*[a-zA-Z\s\.\,]+", text):
print("True: ", text)
else:
print("False:", text)
re.match()による英字を含む文章のマッチ判定
True: 英単語を含むtext
True: only alphabet text
False: 日本語のみの文章
True: alphabet
False: カタカナ
False: 文字列
False: 1234
はじめに
pythonでリストを扱う際に,英字を含む要素が不要なので削除したいと思い,簡単な方法がないか調べていたところ勘違いしやすいものが検索に引っかかるため記事を備忘録的に書くことにしました.
簡潔にまとめると,str.isalpha()で判定されるのはUnicodeの文字,つまり,漢字やひらがなの場合もTrueとなってしまうので注意してくださいということです.
そこで,本記事ではpythonで英字(alphabet)の判定をする時の色々なパターンと,str.isalpa()の挙動の確認をしていきたいと思います.
標準ライブラリを使う方法と正規表現のライブラリを使う方法の二つを紹介していきたいと思います.
色々な文字列の判定方法
str.isalpha()による文字列判定
str.isalpha()を用いるとアルファベットだけでなく,漢字やひらがなが含まれている場合もTrueの判定となります.一方で,記号や数字などが含まれている場合はFalseになります.
下記のようにコードを実行すると
text_list = ["英単語を含むtext", "only alphabet text", "日本語のみの文章", "alphabet","カタカナ","文字列", "1234"]
#str.isalpha()はアルファベット,かな文字,漢字全てにマッチする.記号などが文字列に含まれている場合のみがFalseになる.
print("str.isalpha()の出力結果:")
for text in text_list:
print(text.isalpha(),": ",text)
次のような出力結果になります.
re.match()による英字を含む文章のマッチ判定
True: 英単語を含むtext
True: only alphabet text
False: 日本語のみの文章
True: alphabet
False: カタカナ
False: 文字列
False: 1234
英字・カナ文字・漢字・ひらがななどで構成されたテキストかどうか判定するときには使えそうですが,記号・数字が含まれている場合はFalseになってしまうので注意が必要です.
リストの要素が単語かどうかの判定などには使えそうですね.
str.isascii()による文字列の判定
str.isascii()を使うと英字・記号・数字が含まれるようなテキストに対してTrueの判定を返します.
下記のようにコードを実行すると
text_list = ["英単語を含むtext", "only alphabet text", "日本語のみの文章", "alphabet","カタカナ","文字列", "1234"]
#str.isascii()はアルファベットと一部の記号・数字などで構成されている場合,Trueになる.
print("str.isascii()の出力結果:")
for text in text_list:
print(text.isascii(),": ",text)
次のような出力結果になります.
str.isascii()の出力結果:
False : 英単語を含むtext
True : only alphabet text
False : 日本語のみの文章
True : alphabet
False : カタカナ
False : 文字列
True : 1234
英字で構成された文章を判定することできます.
一方で,電話番号などの数字と記号からなっているようなテキストもTrueが帰ってきてしまうので注意が必要そうです.
英字や英文で構成された文字列の判定
判定対象を細かく条件指定したい場合,正規表現を用いることで適切な条件設定を作ることができます.
本例では,英字や英文からなる文字列のみにmatchするように正規表現を記述し,判定してみた例になります.
下記のようにコードを実行すると
import re
text_list = ["英単語を含むtext", "only alphabet text", "日本語のみの文章", "alphabet","カタカナ","文字列", "1234"]
#英字のみで構成されている場合をマッチさせる場合(アルファベットのみの場合と空白,カンマ,ピリオドが含まれる場合を抽出)
print("re.match()による英字のみのマッチ判定")
for text in text_list:
if re.match("[a-zA-Z\s\.\,]+", text):
print("True: ", text)
else:
print("False:", text)
次のような出力結果になります.
re.match()による英字のみのマッチ判定
False: 英単語を含むtext
True: only alphabet text
False: 日本語のみの文章
True: alphabet
False: カタカナ
False: 文字列
False: 1234
今回設定した条件に,英字や英文のようなテキストのみTrueになるように正規表現を用いて設定しています.この正規表現に0-9を加えれば,数字が含まれるケース,すなわちstr.ascii()と同じような判定を再現することができます.
英字を含むような日本語の文字列の判定
英字が含まれている場合全てをTrueと返すような正規表現も載せておきたいと思います.入力したテキスト内に英字が少しでも含まれていればTrueの判定になります.
下記のようにコードを実行すると
import re
text_list = ["英単語を含むtext", "only alphabet text", "日本語のみの文章", "alphabet","カタカナ","文字列", "1234"]
#英字を含む文章に対して判定をしたい場合
print("re.match()による英字を含む文章のマッチ判定")
for text in text_list:
if re.match(".*[a-zA-Z\s\.\,]+", text):
print("True: ", text)
else:
print("False:", text)
# print(re.match("[a-zA-Z]+", text))
次のような出力結果になります.
re.match()による英字のみのマッチ判定
re.match()による英字を含む文章のマッチ判定
True: 英単語を含むtext
True: only alphabet text
False: 日本語のみの文章
True: alphabet
False: カタカナ
False: 文字列
False: 1234
正規表現の部分をいじれば判定条件をさらにカスタマイズできるので必要に応じて書き換えてください.
最後に
今回は,英字や英文の文字列判定のためのpythonコードの作成方法を解説していきました.
標準ライブラリで用意されているものを使うのは簡単ですが,細かい条件判定の設定をしたい場合には正規表現を使うことで実現できるかと思います.
皆さんが自分と同じようにstr.isalpha()に騙されず,目的の文字列判定がこの記事を通じてできるようになっていることを祈っています.
また,今後こういったものを調べる際にもライブラリ名に騙されず,しっかりと内容を読んだ上で使っていくようにしたいと思います…
コメント