web-dev-qa-db-ja.com

Python:文字列に漢字が含まれているかどうかを確認しますか?

ひょっとするとこれ

ipath= "./data/NCDC/上海/虹桥/9705626661750dat.txt"

またはこれ

ipath = './data/NCDC/ciampino/6240476818161dat.txt'

最初の文字列にchineseが含まれていることを確認するにはどうすればよいですか?

私はこの答えが役に立つと思います: Python and Regex を使用して文字列内のすべての中国語テキストを検索します)==

しかしそれはうまくいきませんでした:

import re
ipath= "./data/NCDC/上海/虹桥/9705626661750dat.txt"
re.findall(ur'[\u4e00-\u9fff]+', ipath) # => []
12
cqcn1991

一致する文字列もUnicodeである必要があります

>>> import re
>>> ipath= u"./data/NCDC/上海/虹桥/9705626661750dat.txt"
>>> re.findall(r'[\u4e00-\u9fff]+', ipath)
[u'\u4e0a\u6d77', u'\u8679\u6865']
14
xecgr

文字列に漢字があるかどうかを知りたいだけなら、re.findall、 使用する re.searchおよびオブジェクトに一致するという事実は真実です。

>>> import re
>>> ipath= u'./data/NCDC/上海/虹桥/9705626661750dat.txt'
>>> ipath2 = u'./data/NCDC/ciampino/6240476818161dat.txt'
>>> for x in (ipath, ipath2):
...     if re.search(u'[\u4e00-\u9fff]', x):
...         print 'found chinese character in ' + x
... 
found chinese character in ./data/NCDC/上海/虹桥/9705626661750dat.txt
7
timgeb

そして、reを気にしない私たちのために:

>>> ipath= u"./data/NCDC/上海/虹桥/6240476818161dat.txt"
>>> for i in range(len(ipath)):
...  if ipath[i] > u'\u4e00' and ipath[i] < u'\u9fff':
...   print ipath[i]
... 
上
海
虹
桥

編集:中国語の文字の完全なリストについては、このSOリンクはU + 4E00..U + 9FFFの範囲が完全ではないため、一見の価値があります。 中国語の完全な範囲とはUnicodeの文字?

5
Rolf of Saxony
import re
ipath= raw_input()
print re.findall(ur'[\u4e00-\u9fff]+', ipath.decode("utf-8"))

出力:./data/NCDC/上海/虹桥/9705626661750dat.txt [u'\u4e0a\u6d77', u'\u8679\u6865']

入力をユニコードにするには、デコードする必要があります。

または

 import re
 ipath= unicode(raw_input(),encoding="utf-8")
 print re.findall(ur'[\u4e00-\u9fff]+', ipath)
2
vks

これらのコードポイント範囲 を使用して、is_cjk 関数:

# list of cjk codepoint ranges
# tuples indicate the bottom and top of the range, inclusive
cjk_ranges = [
        ( 0x4E00,  0x62FF),
        ( 0x6300,  0x77FF),
        ( 0x7800,  0x8CFF),
        ( 0x8D00,  0x9FCC),
        ( 0x3400,  0x4DB5),
        (0x20000, 0x215FF),
        (0x21600, 0x230FF),
        (0x23100, 0x245FF),
        (0x24600, 0x260FF),
        (0x26100, 0x275FF),
        (0x27600, 0x290FF),
        (0x29100, 0x2A6DF),
        (0x2A700, 0x2B734),
        (0x2B740, 0x2B81D),
        (0x2B820, 0x2CEAF),
        (0x2CEB0, 0x2EBEF),
        (0x2F800, 0x2FA1F)
    ]

def is_cjk(char):
    char = ord(char)
    for bottom, top in cjk_ranges:
        if char >= bottom and char <= top:
            return True
    return False

これを使用してテキストを処理できます。filteranyallmapなどの関数を使用して、テキストを文字ごとに処理します。または、より複雑な関数を作成します。

txt = "./data/NCDC/上海/虹桥/9705626661750dat.txt"
txt_sanitized = "./data/NCDC/9705626661750dat.txt"
any(map(is_cjk, txt)) # True
any(map(is_cjk, txt_sanitized)) # False
''.join(filter(is_cjk, txt)) # '上海虹桥'

CJKの範囲には漢字だけでなく、韓国語や日本語の文字も含まれる可能性があることに注意してください。より複雑な使用法については、 cjklib のような専用ライブラリを試してください。

1
9999years

''は、Python 2のバイト文字列です。2。モジュールの上部にfrom __future__ import unicode_literalsを追加するか、Unicodeリテラルを使用します:u''

>>> import re
>>> ipath= u"./data/NCDC/上海/虹桥/9705626661750dat.txt"
>>> re.findall(ur'[\u4e00-\u9fff]+', ipath)
[u'\u4e0a\u6d77', u'\u8679\u6865']
1
jfs

python 3.6でこれを使用しました

def find_china_symbols(text):
"""

:param text: input text with wrong symbols
:return: True if incorrect char exists in text
"""

for char in text:
    if ord(char) > 10000:
        print(char, ': ', ord(char))
        return True

この質問 によると、範囲は[\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]

0
Kevin He