search
LoginSignup
345
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

ハイフンに似ている横棒を全て統一するᅳㅡ˗𐆑–᭸‒-─−▬𐄐—━‐‑ー﹣―ー﹘-⁃➖⁻!

はじめに

これらの横棒、コンピュータにとっては全て違うのですが
見分けがつくでしょうか?
-˗ᅳ᭸‐‑‒–—―⁃⁻−▬─━➖ーㅡ﹘﹣-ー𐄐𐆑

郵便番号、住所、電話番号など、横棒が使われているデータを扱うとき、
人が入力したデータや購入したデータであると、同じ記号が使われていないことはよくあることです。

090-1234-5678
090᭸1234᭸5678
090‑1234‑5678
090−1234−5678
これらの電話番号の文字列も

phone_no_list = ['090-1234-5678', '090᭸1234᭸5678', '090‑1234‑5678', '090−1234−5678']

# 文字をUnicodeコードポイントに変換
for n in phone_no_list:
    # 文字列の4番目の横棒の文字コードを見てみる
    print(n[3], ord(n[3]))

"""
出力:
- 45
᭸ 7032
‑ 8209
− 8722
"""

このように全て違います。

ハイフンに似ている横棒を全て統一する

今回は、
【 ‾(Overline)】 と 【 _(Low Line/アンダースコア)】のおよそ中間の高さにある横棒を集めて、
これらを一つの記号に統一します

ハイフンに似ている横棒の一覧

まずは、記号を調査しました。

参考にしたサイトはこちらです。
Unicode キャラクター図鑑(https://unicode-table.com/jp/)

記号 Unicode コードポイント Unicode 番号 entity Unicode 称号
0 - 45 U+002D Hyphen-Minus (半角マイナス)
1 ˗ 727 U+02D7 Modifier Letter Minus Sign
2 4467 U+1173 Hangul Jungseong Eu
3 7032 U+1B78 Balinese Musical Symbol Left-Hand Open Pang
4 8208 U+2010 ‐ Hyphen
5 8209 U+2011 Non-Breaking Hyphen
6 8210 U+2012 Figure Dash
7 8211 U+2013 – En Dash
8 8212 U+2014 — Em Dash
9 8213 U+2015 ― Horizontal Bar
10 8259 U+2043 ⁃ Hyphen Bullet
11 8315 U+207B Superscript Minus
12 8722 U+2212 Minus Sign
13 9644 U+25AC Black Rectangle
14 9472 U+2500 Box Drawings Light Horizontal
15 9473 U+2501 Heavy Minus Sign
16 10134 U+2796 Box Drawings Heavy Horizontal
17 12540 U+30FC Katakana-Hiragana Prolonged Sound Mark (全角の長音)
18 12641 U+3161 Hangul Letter Eu
19 65112 U+FE58 Small Em Dash
20 65123 U+FE63 Small Hyphen-Minus
21 65293 U+FF0D Fullwidth Hyphen-Minus (全角ハイフン)
22 65392 U+FF70 Halfwidth Katakana-Hiragana Prolonged Sound Mark (半角カナの長音)
23 𐄐 65808 U+10110 Aegean Number Ten
24 𐆑 65937 U+10191 Roman Uncia Sign
25 5760 U+1680 Ogham Space Mark

同じ記号に全て統一(Python)

試しに
「あᅳㅡ˗𐆑–᭸‒-─−▬𐄐—━‐‑ー﹣―ー﹘-⁃➖⁻!」
の横棒を「-(半角マイナス)」に統一してみます。

import re

def replace_hyphen(text, replace_hyphen):
    """全ての横棒を半角ハイフンに置換する
    Args:
        text (str): 入力するテキスト
        replace_hyphen (str): 置換したい文字列
    Returns:
        (str): 置換後のテキスト
    """
    hyphens = '-˗ᅳ᭸‐‑‒–—―⁃⁻−▬─━➖ーㅡ﹘﹣-ー𐄐𐆑 '
    hyphens = '|'.join(hyphens)
    return re.sub(hyphens, replace_hyphen, text)
# 名寄せしたいテキスト
text = 'あᅳㅡ˗𐆑–᭸‒- ─−▬𐄐—━‐‑ー﹣―ー﹘-⁃➖⁻!' 

# replace_hyphen に統一する記号を設定
print(replace_hyphen(text, replace_hyphen='-'))

"""
出力:
あ--------------------------!
"""

はい。これで綺麗になりました。

終わりに

以上。
これから名寄せ作業があるかもしれないので、メモを残しました。

他に、似たような横棒があれば教えてください。

データの追加
表に、   (Ogham Space Mark) を追加しました(2021/10/26)


追記:
(2021/10/26)
実際の名寄せでは、
長音や漢字の1を抜いた状態で記号を名寄せして
長音は、長音だけで処理するというのが一般的な方法になるのかなと思います。
そうでないと、住所に含まれているマンション名などの長音が記号になってしまうので。

(2021/11/4)
コメント↓で色々アドバイスいただけたので、そちらも参考にしていただければと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
345
Help us understand the problem. What are the problem?