芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

日本語文字の抽出

pip install regex

>>> import regex
>>> nihonji = regex.compile(r'(\p{Script=Han}|\p{Script=Hiragana}|\p{Script=Katakana})+')
>>> test = "あ㋐アア亜aAあ㋐アア亜aA"
>>> nihonji.search(test)
<regex.Match object; span=(0, 5), match='あ㋐アア亜'>
>>> nihonji.search(test).span()
(0, 5)
>>> nihonji.search(test).group()
'あ㋐アア亜'

これだと最初にマッチしたものの情報しか返してくれないので, forで回してマッチしたものの情報を返すようにしよう.

>>> def nihonji_search(text):
    res = []
    nihonji = regex.compile(r'(\p{Script=Han}|\p{Script=Hiragana}|\p{Script=Katakana})+')
    pos = 0
    while True:
        nihonji_res = nihonji.search(text)
        if nihonji_res != None:
            word = nihonji_res.group()
            res.append({"word":word,
                    "pos_start":nihonji_res.span()[0]+pos,
                    "pos_end":nihonji_res.span()[1]+pos,
                    "long":len(word)})
            start,end = nihonji_res.span()
            pos += end
            text = text[end:]
            continue
        else:
            break
    return res

>>> test = "あ㋐アア亜aAあ㋐アア亜aAあ㋐アア亜aA"
>>> nihonji_search(test)
[{'word': 'あ㋐アア亜', 'pos_start': 0, 'pos_end': 5, 'long': 5}, {'word': 'あ㋐アア亜', 'pos_start': 7, 'pos_end': 12, 'long': 5}, {'word': 'あ㋐アア亜', 'pos_start': 14, 'pos_end': 19, 'long': 5}]

こんなかんじで文字列から日本語文字だけ抽出できるかと思います~

note.nkmk.me

絵文字

絵文字の場合, qiita.com にあるようにEmojiというモジュールでも抽出できるんですよね.

import emoji

for i in text:
    if i in emoji.UNICODE_EMOJI:
        print(i)

ただ,一文字だけの絵文字の判定で顔文字や記号は判定できないのと, 同じようなことは以上のregexでもできるわけでして,

>>> p = regex.compile(r'(\p{Emoji_Presentation=Yes}|[\U0001F300-\U0001F5FF]|[\U0001F600-\U0001F64F])+')
>>> p.search("\(^ ω^\Ξ/^ω^)/")
>>> p.search('☆')

...
顔文字や記号は別ですね...