如何正则表达式匹配字节字符串并除去反斜杠之外的标点符号?

2024-09-27 21:32:34 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您有一个如下所示的字符串:

text = "I love 🧸 so much!"

text = text.encode()
text = b"I love \xf0\x9f\xa7\xb8 so much!"

我想保留已编码的bear,但在末尾删除!。我将使用正则表达式匹配所有内容,但标点符号是text = re.sub(b"[^\w\s\\]", b"", text)

但这会抛出error: unterminated character set at position 0,因为我认为最后一个]会逃逸。以text = re.sub(b"[^\w\s\\\]", b"", text)的形式尝试正则表达式可以解决此错误,但随后正则表达式将删除编码的bear和!text = b"I love so much"

我需要某种方法使\成为正则表达式的一部分,以保留熊。到目前为止,我已经尝试:

[^\w\s\\[\w\d]{3}]
[^\w\s\\[A-Za-z0-9]{3}]
[^\\\w\s]

我的头撞在墙上试图解决这个问题


Tags: 字符串textre内容编码soencodebear
2条回答

此方法不使用正则表达式。如果使用正则表达式是必需的,则必须忽略这一点

import string

punc = string.punctuations.encode()

text = b"I love \xf0\x9f\xa7\xb8 so much!" 

clean_text = text.translate(None, punc)

bytes.translate返回bytes或bytearray对象的副本,其中删除可选参数delete中出现的所有字节。 因此clean_text变成了b"I love \xf0\x9f\xa7\xb8 so much"

您必须对正则表达式使用r-string,而不是b-string,因此使用b'...'代替r'...'。此外,您不能将正则表达式应用于字节字符串,因此必须首先将其转换为字符串。以下是未更改正则表达式的完整工作代码:

Try it online!

import re
text = b"I love \xf0\x9f\xa7\xb8 so much!"
text = str(text)[2:-1]
text = re.sub(r'[^\w\s\\]', '', text)
print(text)

输出:

I love \xf0\x9f\xa7\xb8 so much

您可能希望使用text.encode('unicode_escape')(它给出了b'I love \\U0001f9f8 so much!')而不是仅仅使用text.encode()(它给出了b'I love \xf0\x9f\xa7\xb8 so much!'),因为将字符串表示为unicode转义而不是十六进制转义更为正确和可重用

相关问题 更多 >

    热门问题