やりたいこと
以下のようなファイルを読み込み、日付ごとに区切ってオブジェクトに格納したい。
■元データ
2023/11/04 apple.
2023/11/05 banana. 2023/11/06 orange.
■分割後
# 1つ目のデータ
2023/11/04 apple.
# 2つ目のデータ
2023/11/05 banana.
# 3つ目のデータ
2023/11/06 orange.
問題点
Pythonで正規表現を利用する場合 re
を利用する。
ただし何も考えずにやってしまうと、区切り文字として指定した文字が消えてしまう。
■例
import re
# データを格納する変数
data = None
# データ読み込み
with open("fruits.txt", "r") as file:
data = file.read()
# 日付にマッチする正規表現
pattern = r"\d{4}/\d{1,2}/\d{1,2}"
# データを日付で区切って分割
result = re.split(pattern, data)
print(result)
■結果
日付が消えてしまった。
['', ' apple.\n', ' banana. ', ' orange.']
解決策
正規表現の先読みを利用することで、きれいに分割することができる。
前提知識:先読みとは?
通常の正規表現は「文字」にマッチするが、先読みは「位置」にマッチする。
文法は以下の通り。
(?=パターン)
正規表現の先読みを利用することで
「日付の直前の位置」を区切り文字に指定することができる。
結果、日付を残したまま分割することができるという寸法だ。
実装例
■コード
import re
data = None
# ファイルの中身を読み込む
with open("fruits.txt", "r") as file:
data = file.read()
# 日付にマッチする正規表現(先読み)
pattern = r"(?=\d{4}/\d{1,2}/\d{1,2})"
# データを分割
result = re.split(pattern, data)
print(result)
■結果
['', '2023/11/04 apple.\n', '2023/11/05 banana. ', '2023/11/06 orange.']
最初の空文字や、改行文字については必要に応じて除去すれば良い。
まとめ
- Pythonで正規表現を扱う際は
re
を利用する - 正規表現の先読みを利用することで、文字列そのものではなく、位置を指定することができる
- マッチした位置を基準に分割するので、分割文字が消えずに残る
- 先読みの他に、正規表現には「後読み」もある