Eine Zeichenfolge vielleicht das
ipath= "./data/NCDC/上海/虹桥/9705626661750dat.txt"
oder dieses
ipath = './data/NCDC/ciampino/6240476818161dat.txt'
Woher weiß ich, dass der erste String chinese enthält?
Ich finde diese Antwort vielleicht hilfreich: Finde alle chinesischen Texte in einer Zeichenfolge mit Python und Regex
aber es hat nicht geklappt:
import re
ipath= "./data/NCDC/上海/虹桥/9705626661750dat.txt"
re.findall(ur'[\u4e00-\u9fff]+', ipath) # => []
Die übereinstimmende Zeichenfolge sollte ebenfalls Unicode sein
>>> import re
>>> ipath= u"./data/NCDC/上海/虹桥/9705626661750dat.txt"
>>> re.findall(ur'[\u4e00-\u9fff]+', ipath)
[u'\u4e0a\u6d77', u'\u8679\u6865']
Wenn Sie nur wissen möchten, ob in Ihrer Zeichenfolge ein chinesisches Zeichen enthalten ist, benötigen Sie re.findall
nicht. Verwenden Sie re.search
und die Tatsache, dass übereinstimmende Objekte wahr sind.
>>> 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
Und für diejenigen von uns, die sich nicht für re
interessieren:
>>> 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]
...
上
海
虹
桥
Bearbeiten: Für die vollständige Liste der chinesischen Zeichen sollte dieser SO -Link betrachtet werden, da der Bereich U + 4E00..U + 9FFF nicht vollständig ist. Was ist der komplette Bereich für chinesische Zeichen in Unicode?
import re
ipath= raw_input()
print re.findall(ur'[\u4e00-\u9fff]+', ipath.decode("utf-8"))
Ausgabe: ./data/NCDC/上海/虹桥/9705626661750dat.txt [u'\u4e0a\u6d77', u'\u8679\u6865']
Sie müssen die Eingabe dekodieren, damit sie Unicode wird.
oder
import re
ipath= unicode(raw_input(),encoding="utf-8")
print re.findall(ur'[\u4e00-\u9fff]+', ipath)
''
Ist ein Bytestring für Python 2. Fügen Sie entweder from __future__ import unicode_literals
Oben im Modul hinzu oder verwenden Sie Unicode-Literale: u''
:
>>> import re
>>> ipath= u"./data/NCDC/上海/虹桥/9705626661750dat.txt"
>>> re.findall(ur'[\u4e00-\u9fff]+', ipath)
[u'\u4e0a\u6d77', u'\u8679\u6865']
In Python 3.6 habe ich das verwendet
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
Gemäß dieser Frage sollte der Bereich [\u2E80-\u2FD5\u3190-\u319f\u3400-\u4DBF\u4E00-\u9FCC]
sein
Mit diesen Codepunktbereichen können wir eine is_cjk
-Funktion schreiben:
# 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
Damit können wir Text verarbeiten, indem Sie Funktionen wie filter
, any
, all
und map
verwenden, um den Text zeichenweise zu verarbeiten oder komplexere Funktionen zu erstellen:
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)) # '上海虹桥'
Beachten Sie, dass die CJK-Bereiche nicht nur chinesische, sondern auch koreanische und japanische Zeichen enthalten können. Versuchen Sie für eine komplexere Verwendung eine dedizierte Bibliothek wie cjklib
.