我有一个字符串: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
答案 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>
使用反向匹配,删除(分割)所有不需要的字符。