gpt4 book ai didi

Python 正则表达式 £ 符号

转载 作者:太空狗 更新时间:2023-10-30 02:44:28 25 4
gpt4 key购买 nike

我正在读取包含井号 (£) 的文本文件:

f = open(file, 'r')
string = f.read()
f.close()

连同其他一些正则表达式操作,我想删除这些井号,并将字符串写入新文件。我最接近完成这项工作的是以下代码:

n = re.compile(unichr(163))
string = n.sub('', string)

这似乎正确地找到了英镑符号,但是 £ 没有被替换,而是被转换为这个符号:

有人知道发生了什么事吗?

最佳答案

总结:

In utf8, £ maps to raw bytes \xc2\xa3. The re module allows for string substitution to occur between unicode and byte encoded strings, which is an error.

我认为 J.F. Sebastian 的 answer更简洁,但这里有一个演练。

详情:

调用 read() 返回一个字节串。

为了说明,让我们创建以下文件 durp:

echo -n "£" > durp

下一个命令获取文件的十六进制内容:

$ cat durp | xxd  | cut -d " " -f 2
c2a3

注意:访问这个url将以多种编码显示 £

这些是构成 £ 的原始字节。 python 在读取文件时对文件做了什么?

$ python
> f = open("durp")
> f.read()
'\xc2\xa3'

它不知道编码是什么,所以它以转义的十六进制形式表示字节。

让我们导入您的代码:

> import re
> r = re.compile(u'£')
> u'£'
u'\xa3'

最后一行只是为了查看我们正在制作图案的内容。这是错误的来源。

现在我们对文件的内容进行替换:

> r.sub('', '\xc2\xa3')
'\xc2'

这是可以想象但错误的。我们用 '\xa3' 替换 '\xc2\xa3' 中的 '' 得到了 '\xc2' .这是 re 中的错误,因为 unicode 字符串与字节串混合在一起。对具有不同编码的字符执行替换没有意义。这本质上是用字节代替字符。

J.F.塞巴斯蒂安的 answer说明您的终端如何将 '\xc2' 解释为

关于Python 正则表达式 £ 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29291550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com