質問: re.match('[a-zA-Z]', i["_source"]["place"]["full_name"]) if match != None: print(i["_source"]["place"]["full_name"]) ``` i["_source"]["place"]["full_name"]に元のデータが入ってます ### 試したこと re.search('[ぁ-ん ァ-ン 一-龥]', i["_source"]["place"]["full_name"])をつかって、if match != None:の分岐後、日本語を含む単語であれば、その地名を省くように書いたのですが省かれませんでした ### 補足情報(FW/ツールのバージョンなど) python3 正規表現
回答: 漢字やひらがな、カタカナは全部が Unicode 上で連続して並んでいるわけではないので、`ぁ-ん ァ-ン 一-龥` のように範囲で判定するのは無理なのではないでしょか。 調べたら以下のやり方が見つかりました。 方法1: regex で Unicode プロパティでマッチさせる。 Unicode のプロパティマップというのがあるそうですが、標準ライブラリは re モジュールは対応していないので、regex という外部のライブラリを使う必要があるみたいです。 正規表現での漢字マッチをUnicodeプロパティーを使って綺麗に書く方法 in Python - Qiita 方法2: Unicode 文字の名前で判断する。 例えば、`あ` の Unicode 上での正式名称は HIRAGANA LETTER A 、漢字だと `CJK UNIFIED ~` となっているので、この名称で判断する方法もあります。 ``` print(unicodedata.name("あ")) # HIRAGANA LETTER A print(unicodedata.name("毛")) # CJK UNIFIED IDEOGRAPH-6BDB ``` Pythonで、文字列に日本語が含まれているか判定する - minus9d's diary 方法2の場合のコード ``` import unicodedata lst = [ "Tokyo-to, Japan", "北海道 小樽市", "Shibuya-ku, Tokyo", "東京 新宿区", "長野 松本市", "Shibuya-ku, Tokyo", "JRA 東京競馬場", "Joetsu-shi, Niigata", "JR三ノ宮駅", "Shinto-mura, Gunma", "JR 東海三島駅・新幹線", "Chiyoda-ku, Tokyo", "Aomori-shi, Aomori", ] def is_japanese(string): include_jp = False # string が日本語 (漢字、カタカナ、ひらがな) を含むかどうか include_en = False # string がアルファベットを含むかどうか for ch in string: name = unicodedata.name(ch) if "CJK UNIFIED" in name or "HIRAGANA" in name or "KATAKANA" in name: include_jp = True elif "LATIN" in name: include_en = True # 日本語とアルファベットの両方が含まれる場合は False そうでない場合は True を返す。 return not (include_jp and include_en) lst = list(filter(is_japanese, lst)) for name in lst: print(name) # Tokyo-to, Japan # 北海道 小樽市 # Shibuya-ku, Tokyo # 東京 新宿区 # 長野 松本市 # Shibuya-ku, Tokyo # Joetsu-shi, Niigata # Shinto-mura, Gunma # Chiyoda-ku, Tokyo # Aomori-shi, Aomori ``` ``` JRA 東京競馬場 JR三ノ宮駅 JR 東海三島駅・新幹線 ``` の3件が除外されました。