正規表現について(日付)
正規表現について(日付)
領収書レシートデータを OCR 読み取りするときに日付の表記がぶれることがあります。
それを修正する正規表現です。
def format_date(date_str):
patterns = [
(r'(\d{4})[-/年](\d{1,2})[-/月](\d{1,2})[日]?.*?(?:\(.+?\))?', '%Y年%m月%d日'),
(r'(\d{2})[-/年](\d{1,2})[-/月](\d{1,2})[日]?.*?(?:\(.+?\))?', '%y年%m月%d日')
]
for pattern, date_format in patterns:
match = re.match(pattern, date_str)
if match:
try:
formatted_date = datetime.strptime(match.group(0), date_format).strftime('%Y/%m/%d')
return formatted_date
except ValueError:
continue
return date_str
特にここの部分について内容を見ていきましょう。
(r'(\d{4})[-/年](\d{1,2})[-/月](\d{1,2})[日]?.*?(?:\(.+?\))?', '%Y年%m月%d日'),
(r'(\d{2})[-/年](\d{1,2})[-/月](\d{1,2})[日]?.*?(?:\(.+?\))?', '%y年%m月%d日')
1.
(r'(\d{4})[-/年](\d{1,2})[-/月](\d{1,2})[日]?.*?(?:\(.+?\))?', '%Y年%m月%d日')
1.
(\d{4})
: 4桁の数字が連続する部分を表します(例:2023)。これは西暦の年を表しています。
[-/年]
: 年の区切り文字としてハイフン(-)、スラッシュ(/)、または「年」のいずれかが来ます。
(\d{1,2})
: 1または2桁の数字が連続する部分を表します(例:01、1)。これは月を表しています。
[-/月]
: 月の区切り文字としてハイフン(-)、スラッシュ(/)、または「月」のいずれかが来ます。
(\d{1,2})
: 1または2桁の数字が連続する部分を表します(例:23、3)。これは日を表しています。
[日]?
: 「日」が0回または1回出現します。
.*?(?:\(.+?\))?
: 任意の文字が0回以上続く部分に対応し、その後に丸括弧で囲まれた任意の文字が0回以上続く部分が0回または1回出現します。この部分は曜日や時刻などの追加情報を無視するために使用されます。
%Y年%m月%d日
: 日付の出力フォーマットを指定します。%Yは4桁の年、%mは2桁の月、%dは2桁の日を表します。
2.
(r'(\d{2})[-/年](\d{1,2})[-/月](\d{1,2})[日]?.*?(?:\(.+?\))?', '%y年%m月%d日')
2.
(\d{2})
: 2桁の数字が連続する部分を表します(例:23)。これは西暦の下2桁の年を表しています。
- 他の部分は1つ目の正規表現と同様です。
%y年%m月%d日
: 日付の出力フォーマットを指定します。%yは西暦の下2桁の年、%mは2桁の月、%dは2桁の日を表します。
これらの正規表現は、年の部分だけが異なります。
1つ目の正規表現は4桁の年(西暦)を表現し、2つ目の正規表現は2桁の年(西暦の下2桁)を表現しています。両方の正規表現は、月、日、区切り文字、および括弧内の任意の文字(曜日や時刻など)については同じパターンを使用しています。
これらの正規表現は、異なる日付フォーマットを解析し、適切な出力フォーマットに変換する際に使用されます。1つ目の正規表現は %Y年%m月%d日
の出力フォーマットを持ち、2つ目の正規表現は %y年%m月%d日
の出力フォーマットを持ちます。
要するに、これらの正規表現は、年の桁数が異なる2つの日付フォーマットを処理するために使用されています。それ以外の部分については、両方の正規表現が同じパターンを使用しています。