正则表达式不能匹配python中的特殊符号

时间:2019-01-02 08:10:45

标签: python regex

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

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:2)

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

Python中有许多转义代码,它们不能在源代码的常规字符串中逐字地表示自己。例如,"\n"代表单个换行符,即使Python表示法占用两个字符也是如此。反斜杠用于引入此符号。有许多专用的转义码,例如\r\a等,以及通用记号\x01,它允许您以十六进制记号(\n等效于\x0a\r等效于\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和regex引擎都解释反斜杠(有时以不兼容的方式),我们通常更喜欢对正则表达式使用原始字符串。

答案 2 :(得分:0)

另一种方法:

<select name="Service">
<option value="0">Please select</option>
<option value="1">Add-on product here</option>
</select>

$srvType = $_POST["srvType"];

// now for the paypal part, I have this

<input type="hidden" name="amount" value="<?php if ($srvType==0) { echo "38.00"; } else if ($srvType==1) { echo "40.00"; } ?>"><br>

使用反向匹配,删除(分割)所有不需要的字符。