使用re.sub删除双引号



我正在尝试从Python中的文本文件中删除双引号。语句print re.sub(r'"', '', line)在解释器中有效,但在文件中使用时无效。为什么会这样?

直接从解释器:

>>> 
>>> import re  
>>> str = "bill"  
>>> print re.sub(r'"', '', str)  
bill
>>> 

从我的.py文件:

def remove_quotes (filename):  
    with open(filename, 'rU') as file:  
        print re.sub(r'"', '', file.read())  

输出:

“Bill”  
“pretty good”       bastante bien  
“friendship”        amistad  
 “teenager”     adolescent

好吧,正如col6y所指出的,我正在处理花哨的信用证报价。试图摆脱他们:

>>> line  
'xe2x80x9cBillxe2x80x9dn'  
text = line.replace(u'xe2x80x9c', '')  
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)  

尝试其他字符编码:

text=line.replace(u"\u201c",'')
UnicodeDecodeError:"ascii"编解码器无法解码位置0中的字节0xe2:序号不在范围(128)中

在您的解释器示例中,您说:

>>> 
>>> import re  
>>> str = "bill"  
>>> print re.sub(r'"', '', str)  
bill
>>> 

但是,字符串"bill"不包含任何引号,因此这不会测试任何内容。如果你尝试print str,你会发现它一开始就没有引号——这是因为引号标记str是一个字符串,因此不包括在内。(字符串中并不总是需要引号。)如果要包含引号,可以说""bill""'"bill"'

然而,这并不能解释其他程序中的真正问题。要理解这一点,请注意"之间的差异。它们看起来很相似,但略有不同,而且与计算机绝对不同。在您的文件中,您有,但您正在替换"。您还需要替换另外两个。

此外,正如@MikeT所指出的,使用file.read().replace(...)而不是re.replace(..., file.read())会更容易。re.replace用于正则表达式,但这里不需要它们的强大功能。

您还应该注意,file.read()将只读取文件的一部分,而不是整个文件。为此,请考虑使用file.readlines(),并在这些行上进行迭代。

最新更新