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

时间:2016-01-04 08:42:44

标签: python regex unicode python-2.x

字符串可能是

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

或者

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

我如何知道第一个字符串包含中文

我觉得这个答案可能有帮助: Find all Chinese text in a string using Python and Regex

但它没有成功:

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

8 个答案:

答案 0 :(得分:10)

匹配的字符串也应该是unicode

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

答案 1 :(得分:5)

如果您只是想知道字符串中是否有中文字符,您不需要apiKey: `42452-eofefo-4534535` (optional) Content-Type: application/json Content-Encoding: gzip (optional) ,请使用re.findall以及匹配对象的事实是真实的。

re.search

答案 2 :(得分:5)

对于我们这些不关心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未完成。 What's the complete range for Chinese characters in Unicode?

答案 3 :(得分:2)

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']

您需要解码输入以使其成为unicode。

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

答案 4 :(得分:1)

''是Python 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']

答案 5 :(得分:1)

使用these codepoint ranges,我们可以编写一个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

答案 6 :(得分:0)

在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

答案 7 :(得分:0)

根据this question,范围应为[\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]