簡體   English   中英

Python:檢查字符串是否包含中文字符?

[英]Python: Check if a string contains chinese character?

這可能是一個字符串

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

或這個

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

我怎么知道第一個字符串包含中文

我發現這個答案可能有用: 使用Python和Regex查找字符串中的所有中文文本

但它沒有成功:

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

匹配的字符串也應該是unicode

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

如果您只想知道字符串中是否有中文字符,則不需要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

對於我們這些不關心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中的漢字完整范圍是什么?

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

輸出: ./data/NCDC/上海/虹橋/9705626661750dat.txt [u'\上\海', u'\虹\橋']

您需要解碼輸入以使其成為unicode。

要么

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

''是Python 2上的字節from __future__ import unicode_literals 。要么在模塊頂部添加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']

使用這些代碼點范圍 ,我們可以編寫一個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這樣的專用庫。

在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

根據這個問題 ,范圍應該是[\⺀-\⿕\㆐-\㆟\㐀-\䶿\一-\鿌]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM