我有一个字符串:s = "we are\xaf\x06OK\x03family, good"
,我想用 \xaf
,\x06
和 \x03
加上 '',正则表达式是 pat = re.compile(r'\\[xX][0-9a-fA-F]+')
,但它无法匹配任何内容。代码如下:
pat = re.compile(r'\\[xX][0-9a-fA-F]+')
s = "we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))
结果是
我们是 ¯OKfamily,很好
我们是 ¯OKfamily, good
,
但是我怎样才能我们是一家人,很好
最佳答案
您犯了一个基本但常见的错误,即混淆了 Python 源代码中字符串的表示及其实际值。
Python 中有许多转义码,它们不会在源代码的常规字符串中逐字表示。例如,"\n"
表示单个换行符,即使 Python 表示法占用两个字符。反斜杠用于引入此表示法。有许多专用的转义码,如 \r
、\a
等,还有一个通用符号 \x01
,它允许您编写任何十六进制字符代码(\n
等同于\x0a
,\r
等同于\x0d
, ETC)。要表示文字反斜杠字符,您需要使用另一个反斜杠对其进行转义:"\\"
。
在“原始字符串”中,不支持反斜杠转义;所以 r"\n"
代表一个包含两个字符的字符串,一个反斜杠 \
和一个小写字母 n
。您可以等效地使用非原始字符串表示法编写 "\\n"
。 r
前缀不是字符串的一部分,它只是告诉 Python 如何解释后面引号之间的字符串(即根本不解释;每个字符逐字表示自己)。
您的问题并不清楚您实际需要哪些解释,因此我将针对这两种解释提出解决方案。
这是一个包含实际反斜杠的文字字符串:
pat = re.compile(r'\\[xX][0-9a-fA-F]+')
s = r"we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))
这是一个包含控制字符和非 ASCII 字符的字符串,以及用于删除它们的正则表达式替换:
pat = re.compile(r'[\x00-\x1f\x80-\xff]+')
s = "we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))
另一个复杂的问题是正则表达式引擎有自己内部的反斜杠用途;我们通常更喜欢对正则表达式使用原始字符串,以免 Python 和正则表达式引擎都解释反斜杠(有时以不兼容的方式)。
关于python - 正则表达式无法匹配 python 中的特殊符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003109/