👋

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

2022/12/10に公開

やりたいこと

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

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

Louise
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