【Python】区切り文字を残して分割する

python-logo Python

やりたいこと

以下のようなファイルを読み込み、日付ごとに区切ってオブジェクトに格納したい。

■元データ

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 を利用する
  • 正規表現の先読みを利用することで、文字列そのものではなく、位置を指定することができる
  • マッチした位置を基準に分割するので、分割文字が消えずに残る
  • 先読みの他に、正規表現には「後読み」もある
タイトルとURLをコピーしました