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



字符串可能是这个

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'u4e0au6d77', u'u8679u6865']

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

p{Han}正则表达式与PyPi regex:一起使用

import regex
ipath = "./data/NCDC/上海/虹桥/9705626661750dat.txt"
print(regex.findall(r'p{Han}+', ipath) )
# => ['上海', '虹桥']

请参见Python验证。

regex.search足以检测:

if regex.search(r'p{Han}', ipath):
    print(f'"{ipath}" contains Chinese!')

对于我们这些不关心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中的汉字有哪些?

使用这些代码点范围,我们可以编写一个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这样的专用库。

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

输出:./data/NCDC/上海/虹桥/9705626661750dat.txt [u'u4e0au6d77', u'u8679u6865']

您需要对输入进行解码,使其成为unicode。

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

''是Python 2上的一个字节串。在模块顶部添加from __future__ import unicode_literals,或者使用unicode文字:u'':

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

根据这个问题,范围应该是[u2E80-u2FD5u3190-u319fu3400-u4DBFu4E00-u9FCC]

最新更新