LoginSignup
0
1

【Python】正規表現パターンに生文字列と通常の文字列を使う...機能に違いはあるのか?

Last updated at Posted at 2023-07-30

概要

与えられた値が半角英数字のみか、また、空文字か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]+$'は同じ意味として扱われます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1