概要
与えられた値が半角英数字のみか、また、空文字かNone
ではないか、を判定する関数を実装しました。その過程で、正規表現パターンに生文字列raw string
と通常の文字列を使うと機能(pythonの解釈)に違いがあるのか、についても検証してみました。
サンプルコード
import re
# 半角英数字のみかの判定
def _is_alphanum(value: any) -> bool:
if _is_none_or_empty(value):
return False
return bool(re.fullmatch('^[a-zA-Z0-9]+$', str(value)))
# return True if re.fullmatch('^[a-zA-Z0-9]+$', str(value)) else False
# Noneまたは空文字かの判定
def _is_none_or_empty(value: any) -> bool:
return value is None or value == ''
value01 = 'Sample'
value02 = 1234
value03 = '(^_^)/=半角英数字以外'
value04 = {'key': 'value'}
value05 = None
result01 = _is_alphanum(value01)
result02 = _is_alphanum(value02)
result03 = _is_alphanum(value03)
result04 = _is_alphanum(value04)
result05 = _is_alphanum(value05)
print(result01) # True
print(result02) # True
print(result03) # False
print(result04) # False
print(result05) # False
補足1:関数について
-
_is_alphanum
関数: 与えられた値が半角英数字のみから構成されているかどうかを判定 -
_is_none_or_empty
関数: 与えられた値がNone
または空文字列であるかを判定
補足2:型ヒント
-
(value: any) -> bool
としていますが、これは、Pythonの関数定義において型ヒント(Type Hint)を示します。Python 3.5以降で導入された機能らしい。関数が受け取る引数や返り値のデータ型を明示的に指定するために使われるものであって、あってもなくても実行に影響は与えません(Pythonは動的型付けの言語のため)。 -
bool
は真偽値(True
またはFalse
)のデータ型を表し、関数が常に真偽値を返すことが期待されていることがわかります。 -
any
は、「この引数にはどんな型の値でも渡せるよ〜」ということを意味しています。
補足3:bool()
関数
return bool(re.fullmatch('^[a-zA-Z0-9]+$', str(value)))
上記について。
bool()
関数を使って、re.fullmatch()
関数の返り値を直接ブール値に変換しています。
以下とやっていることは同じです。
return True if re.fullmatch('^[a-zA-Z0-9]+$', str(value)) else False
この場合は、三項演算子を使ってre.fullmatch()
関数がマッチした場合はTrue
を、マッチしない場合はFalse
を返すというコードです。
サンプルコードで書いた(=直接ブール値に変換する)方法の方が、コードを簡潔に保てて読みやすいですね。
補足4:正規表現パターンの生文字列と通常の文字列(本題)
ということで本題です。
以下の二つの違いはなんでしょうか?
# raw string(生文字列)
r'^[a-zA-Z0-9]+$'
# 通常の文字列
'^[a-zA-Z0-9]+$'
"\n"
をr"\n"
と書くとバックスラッシュをエスケープ文字として解釈させないようにできます。ということは、上記のraw string
の方の書き方をすれば、re.fullmatch()
関数のときにバックスラッシュを機能させないようにできるのか?と思いつつ、そうではなかったです。
Pythonではraw string(r"...")
を使っても通常の文字列("...")
を使っても、正規表現パターンは同じように機能します。これはPythonが正規表現パターンの文字列内でバックスラッシュをエスケープシーケンスとして解釈しないため。そのため、r'^[a-zA-Z0-9]+$'
と'^[a-zA-Z0-9]+$'
は同じ意味として扱われます。