質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1137閲覧

英語と日本語が合体した単語だけを除きたい

bokuranoheya

総合スコア5

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/01/23 11:03

前提・実現したいこと

pythonで地名に関するデータを編集をしています。
データとしては、下記のような形です。

Tokyo-to, Japan
北海道 小樽市
Shibuya-ku, Tokyo
東京 新宿区
長野 松本市
Shibuya-ku, Tokyo
JRA 東京競馬場
Joetsu-shi, Niigata
JR三ノ宮駅
Shinto-mura, Gunma
JR 東海三島駅・新幹線
Chiyoda-ku, Tokyo
Aomori-shi, Aomori

ここから、JR三宮駅、JRA 東京競馬場といった、英語と日本語が合体した単語だけを除きたいのですが
どうしたらいいのでしょうか?

発生している問題・エラーメッセージ

日本語だけの地名は省くことができ、以下のようなデータを取るとこまではできました。

Tokyo-to, Japan Shibuya-ku, Tokyo Shibuya-ku, Tokyo JRA 東京競馬場 Joetsu-shi, Niigata JR三ノ宮駅 Shinto-mura, Gunma JR 東海三島駅・新幹線 Chiyoda-ku, Tokyo Aomori-shi, Aomori

該当のソースコード

python

1import re 2 3for i in res["hits"]["hits"]: 4 match = re.match('[a-zA-Z]', i["_source"]["place"]["full_name"]) 5 if match != None: 6 print(i["_source"]["place"]["full_name"]) 7 8

i["_source"]["place"]["full_name"]に元のデータが入ってます

試したこと

re.search('[ぁ-ん ァ-ン 一-龥]', i["_source"]["place"]["full_name"])をつかって、if match != None:の分岐後、日本語を含む単語であれば、その地名を省くように書いたのですが省かれませんでした

補足情報(FW/ツールのバージョンなど)

python3 正規表現

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

漢字やひらがな、カタカナは全部が Unicode 上で連続して並んでいるわけではないので、ぁ-ん ァ-ン 一-龥 のように範囲で判定するのは無理なのではないでしょか。
調べたら以下のやり方が見つかりました。

方法1: regex で Unicode プロパティでマッチさせる。

Unicode のプロパティマップというのがあるそうですが、標準ライブラリは re モジュールは対応していないので、regex という外部のライブラリを使う必要があるみたいです。

正規表現での漢字マッチをUnicodeプロパティーを使って綺麗に書く方法 in Python - Qiita

方法2: Unicode 文字の名前で判断する。

例えば、 の Unicode 上での正式名称は HIRAGANA LETTER A 、漢字だと CJK UNIFIED ~ となっているので、この名称で判断する方法もあります。

python

1 2print(unicodedata.name("あ")) # HIRAGANA LETTER A 3print(unicodedata.name("毛")) # CJK UNIFIED IDEOGRAPH-6BDB

Pythonで、文字列に日本語が含まれているか判定する - minus9d's diary

方法2の場合のコード

python

1import unicodedata 2 3lst = [ 4 "Tokyo-to, Japan", 5 "北海道 小樽市", 6 "Shibuya-ku, Tokyo", 7 "東京 新宿区", 8 "長野 松本市", 9 "Shibuya-ku, Tokyo", 10 "JRA 東京競馬場", 11 "Joetsu-shi, Niigata", 12 "JR三ノ宮駅", 13 "Shinto-mura, Gunma", 14 "JR 東海三島駅・新幹線", 15 "Chiyoda-ku, Tokyo", 16 "Aomori-shi, Aomori", 17] 18 19 20def is_japanese(string): 21 include_jp = False # string が日本語 (漢字、カタカナ、ひらがな) を含むかどうか 22 include_en = False # string がアルファベットを含むかどうか 23 for ch in string: 24 name = unicodedata.name(ch) 25 if "CJK UNIFIED" in name or "HIRAGANA" in name or "KATAKANA" in name: 26 include_jp = True 27 elif "LATIN" in name: 28 include_en = True 29 30 # 日本語とアルファベットの両方が含まれる場合は False そうでない場合は True を返す。 31 return not (include_jp and include_en) 32 33 34lst = list(filter(is_japanese, lst)) 35 36for name in lst: 37 print(name) 38# Tokyo-to, Japan 39# 北海道 小樽市 40# Shibuya-ku, Tokyo 41# 東京 新宿区 42# 長野 松本市 43# Shibuya-ku, Tokyo 44# Joetsu-shi, Niigata 45# Shinto-mura, Gunma 46# Chiyoda-ku, Tokyo 47# Aomori-shi, Aomori
JRA 東京競馬場 JR三ノ宮駅 JR 東海三島駅・新幹線

の3件が除外されました。

投稿2020/01/23 12:21

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bokuranoheya

2020/01/25 08:25

方法2でできました。本当にありがとうございます。コードまで書いていただいて、ソースの記事まで貼っていただき、助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問