2016-07-04 18 views
-3
import os 
import codecs 
import argparse 
os.chdir('C:\\Users\\Kingsaber\\Desktop\\python_excercises') 
a = codecs.open('BeforeKichiku.txt', encoding='utf-8') 
p = a.read() 
print(p) 

import re 

#ch = u"I am from 美国。We should be friends. 朋友." 

b = re.findall(u"[\u4e00-\u9fff]+", a) 
for x in b: 
    print(x) 

预期结果:在变量打印出来的一切“一”,找到u4e00- \ u9fff之间的所有Unicode字符和下面打印出来。正则表达式搜索字符串的预期或字节状物体

会发生什么:文档打印成功,但正则表达式搜索出现以下错误。如果我切换正则表达式来搜索字符串“ch”,那么一切正常。由于某些原因,它不适用于Unicode文档。

错误:

Traceback (most recent call last): 
    File "C:/Users/Kingsaber/Desktop/destruga3.py", line 15, in <module> 
    b = re.findall(u"[\u4e00-\u9fff]+", a) 
    File "C:\Users\Kingsaber\AppData\Local\Programs\Python\Python35-32\lib\re.py", line 213, in findall 
    return _compile(pattern, flags).findall(string) 
TypeError: expected string or bytes-like object 
+0

是的,您正在使用'print',而不是'print()'。在Python 3中没有'ur'前缀,只要在每个地方放下'u'前缀即可。但你需要*特定*并包含你的实际完整的错误信息。 –

+0

哦,我忘了修复打印()。我如何获得更详细的错误信息?它只是说在运行之前无效的语法。 –

+0

如果你用Python解释器运行它,它会给你一个特定的行号和一个指向标记器位置的'^'插入符号。它可能会指向'ur'...''字符串的末尾,因为'ur'不是Python 3中可识别的前缀。只需放下'u'即可。 –

回答

0

您传入文件对象

a = codecs.open('BeforeKichiku.txt', encoding='utf-8') 

# ... 

b = re.findall(u"[\u4e00-\u9fff]+", a) 

注意如何acodecs.open()结果,并传递到are.findall()。您将文件内容改为p。您可能希望使用更有意义的变量名称而不是单字母变量,以便更轻松地发现此类错误。

请注意,你真的不应该使用codecs.open();这是Python 2中的一个较老的API,它有很多问题,并且已经被Python 3中引入的io framework过时,并被反向移植到Python 2中。在Python 3中,只需使用内置的open() call(这是io.open()的别名):

with open('BeforeKichiku.txt', encoding='utf-8') as fileobj: 
    contents = fileobj.read() 
matches = re.findall("[\u4e00-\u9fff]+", contents) 
for match in matches: 
    print(match) 
相关问题