Magicode logo
Magicode
3 min read

Pythonの正規表現で繰り返しの文字列を1つにする。

https://cdn.apollon.ai/media/notebox/blob_wBkwz8l

やりたいこと

PDFに埋め込まれている文字がおかしいときになんとかしたかった。 下みたいにしたい。連続で同じ文字が繰り返しのときに、一つにしたい。
ああああ → あ ああいいううううえお → あいうえお ABCABCABC → ABCABCABC 唯唯諾諾 → 唯諾

やったこと

# resultにはすでに何らかの文字列が入っているものとする
    result = re.sub(r"(.)\1{1,}", "\g<1>", result)  # 繰り返し文字列をまとめる

他にも合わせたスニペット

import re
from unicodedata import normalize
def clean_text(txt:str):
    result = re.sub(r"\s| ",'',txt)                # 空白文字を先に取り去って処理を軽くする
    result = normalize('NFKC', result)              # Unicode正規化
    result = re.sub(r"(.)\1{1,}", "\g<1>", result)  # 繰り返し文字列をまとめる
    if (')(cid:' in result):                        # 文字埋め込み型PDFの際の対応
        return ''
    return result

ルイズコピペもやってみよう!

import re

text = "ルイズ!ルイズ!ルイズ!ルイズぅぅうううわぁああああああああああああああああああああああん!!!\n\
あぁああああ…ああ…あっあっー!あぁああああああ!!!ルイズルイズルイズぅううぁわぁああああ!!!\n\
あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!いい匂いだなぁ…くんくん\n\
んはぁっ!ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!\n\
間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!\n\
小説12巻のルイズたんかわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!\n\
アニメ2期放送されて良かったねルイズたん!あぁあああああ!かわいい!ルイズたん!かわいい!あっああぁああ!"

print(re.sub(r"(.)\1{1,}", "\g<1>", text))

# ルイズ!ルイズ!ルイズ!ルイズぅうわぁあん!
# あぁあ…あ…あっあっー!あぁあ!ルイズルイズルイズぅうぁわぁあ!
# あぁクンカクンカ!クンカクンカ!スーハースーハー!スーハースーハー!い匂いだなぁ…くんくん
# んはぁっ!ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!
# 間違えた!モフモフしたいお!モフモフ!モフモフ!髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!
# 小説12巻のルイズたんかわいかったよぅ!あぁあ…あ…あっあぁあ!ふぁあんっ!
# アニメ2期放送されて良かったねルイズたん!あぁあ!かわい!ルイズたん!かわい!あっあぁあ!

参考

後方置換とか。 色々見たけどここが揃ってる気がしました。
Pythonで正規表現を使う際のグループ化。 Pythonの場合は、$1じゃなくって\g<1>って書かなきゃいけないってのに気づくのに時間がかかりました。

Discussion

コメントにはログインが必要です。