【问题标题】:regexpresion cannot match special symbols in python正则表达式无法匹配python中的特殊符号
【发布时间】:2019-01-02 08:10:45
【问题描述】:

我有一个字符串: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))

结果是

we are ¯OKfamily, good we are ¯OKfamily, good,

但是我怎样才能得到we are OK family, good

【问题讨论】:

标签: python regex


【解决方案1】:

您犯了一个基本但常见的错误,将 Python 源代码中字符串的表示与其实际值混淆。

Python 中有许多转义码在源代码中的常规字符串中并不逐字地表示它们自己。例如,"\n" 表示单个换行符,即使 Python 表示法占用两个字符。反斜杠用于引入这种表示法。有许多专用的转义码,如 \r\a 等,还有一个通用符号 \x01,它允许您以十六进制表示法编写任何字符代码(\n 相当于 \x0a、@987654327 @ 等价于 \x0d 等)。要表示文字反斜杠字符,您需要使用另一个反斜杠对其进行转义:"\\"

在“原始字符串”中,不支持反斜杠转义;所以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 和正则表达式引擎都解释反斜杠(有时以不兼容的方式)。

【讨论】:

  • 抱歉,愚蠢的复制/粘贴错误,代码已更新,立即尝试。
【解决方案2】:

您必须将您的输入 string s 视为原始字符串然后才能工作,请参见以下示例:

pat = re.compile(r'\\[xX][0-9a-fA-F].')
s = r"we are \xaf\x06OK\x03family, good"
print(s)
print(re.sub(pat, '', s))

【讨论】:

    【解决方案3】:

    另一种方法:

    pat = re.compile(r'[^\w\d\s,]+')
    s = "we are \xaf\x06OK\x03family, good"
    print(' '.join(map(lambda x: x.strip(), pat.split(s))))
    #=> we are OK family, good
    

    使用反向匹配,删除(分割)任何不是您想要的字符。

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2017-07-02
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      相关资源
      最近更新 更多