StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Macでひらがな・カタカナの濁点・半濁点が分離してしまったのを元に戻すスクリプト

昨日のエントリで、テキストエディタの「CotEditor」のスクリプト機能の使い方を書きました。その機能をつかって、濁点・半濁点が分離してしまったテキストを元に戻すツールを作ります。


こういうやつをなんとかしたいわけです。
f:id:midnightseminar:20190816235923p:plain



原因がよくわからないし、悩まされているのは私だけなのかも知れないのですが、Macを使っていると、PDF上から文字をコピペしたときに、濁音・半濁音のひらがな・カタカナが、1文字ではなく清音+濁点or半濁点という2文字に分離してしまう現象があります。


たとえば、Wordで以下のように入力します。ここの「ぶ」は普通の「ぶ」1文字です。
f:id:midnightseminar:20190817000024p:plain


これを、PDFで保存して、PDF上の文字列をコピーします。
f:id:midnightseminar:20190817000103p:plain


そして、たとえばエクセルに貼り付けます。比較のために、Wordからコピーした分も貼り付けてあります。
f:id:midnightseminar:20190817000119p:plain


このように、「ぶ」が「ふ」と「゛」に分かれてしまいました。
これは困るので、テキストファイル上にペーストした上で、CotEditorのスクリプトで置換できるようにしておきます。


具体的には、スクリプトは以下のように書きました。
なんかもっと美しい書き方があるような気がしてならないのですが、私にはわからないので、濁音・半濁音を全部並べることにしました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# %%%{CotEditorXInput=AllText}%%%
# %%%{CotEditorXOutput=ReplaceAllText}%%%

import sys
import re

kana_before = ["が","ぎ","ぐ","げ","ご","ざ","じ","ず","ぜ","ぞ","だ","ぢ","づ","で","ど","ば","び","ぶ","べ","ぼ","ぱ","ぴ","ぷ","ぺ","ぽ","ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ","パ","ピ","プ","ペ","ポ"]

kana_after = ["が","ぎ","ぐ","げ","ご","ざ","じ","ず","ぜ","ぞ","だ","ぢ","づ","で","ど","ば","び","ぶ","べ","ぼ","ぱ","ぴ","ぷ","ぺ","ぽ","ガ","ギ","グ","ゲ","ゴ","ザ","ジ","ズ","ゼ","ゾ","ダ","ヂ","ヅ","デ","ド","バ","ビ","ブ","ベ","ボ","パ","ピ","プ","ペ","ポ"]

# 標準入力でテキストをまるごと受け取る
all_text = sys.stdin.read()

# 1個1個置き換えていく
for i in range(len(kana_before)):
	all_text = re.sub(kana_before[i], kana_after[i], all_text)

sys.stdout.write(all_text)


スクリプトの冒頭ですが、1行目はPythonインタープリタの置き場。
2行目は文字コードの宣言で、これを書いてないとエラーが出ました。(私はテキストファイルは基本的にUTF-8でしか使わないので、utf-8と書いておいた。)
3行目は、テキストファイル内の文字を全部取るという意味です。これが標準入力経由でPythonに渡ります。
4行目は、テキストファイル内の文字を全部置換するという意味です。標準出力経由でPythonからCotEditorに渡される文字列に置き換わります。


今回はとくにショートカットは指定しないことにしました。つまりスクリプトは、単に「dakuten.py」という名前で、CotEditorのスクリプトフォルダに入れてあります。
するとこのように、ショートカットキー無しで、一覧から選択する形で実行できるようになります。
f:id:midnightseminar:20190816234554p:plain


実際やってみたら、無事置き換わってくれました。