我正在尝试搜索并替换(对于多个字符)以下字符串:
VAR=%2FlkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA%2B7G3e8%3D&
这些字符中的一个或多个:%3D,%2F,%2B,%23,可以在任何地方找到(字符串的开头,中间或末尾),理想情况下,我想搜索所有这些字符立即(使用一个正则表达式)并分别用=或/或+或#替换它们,然后返回最后一个字符串。
示例1:
VAR=%2FlkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA%2B7G3e8%3D&
应该返回
VAR=/lkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA+7G3e8=&
示例2:
VAR=s2P0n6I%2Flonpj6uCKvYn8PCjp%2F4PUE2TPsltCdmA%3DRQPY%3D&
应该返回
VAR=s2P0n6I/lonpj6uCKvYn8PCjp/4PUE2TPsltCdmA=RQPY=&
答案 0 :(得分:2)
我不相信你需要正则表达式,但用Python做起来相当容易:
x = 'VAR=%2FlkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA%2B7G3e8%3D&'
import re
MAPPING = {
'%3D': '=',
'%2F': '/',
'%2B': '+',
'%23': '#',
}
def replace(match):
return MAPPING[match.group(0)]
print x
print re.sub('%[A-Z0-9]{2}', replace, x)
输出:
VAR=%2FlkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA%2B7G3e8%3D&
VAR=/lkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA+7G3e8=&
答案 1 :(得分:2)
在您的示例中,没有必要使用正则表达式。一个简单的替换方法将:
def rep(s):
for pat, txt in [['%2F','/'], ['%2B','+'], ['%3D','='], ['%23','#']]:
s = s.replace(pat, txt)
return s
答案 2 :(得分:2)
我也不相信你需要正则表达式,但是使用正则表达式进行url-decode是一种更好的方法。基本上你需要将%XX 模式中的每个字符串转换为它所代表的字符串。这可以通过re.sub()
完成,如下所示:
>>> VAR="%2FlkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA%2B7G3e8%3D&"
>>> re.sub(r'%..', lambda x: chr(int(x.group()[1:], 16)), VAR)
'/lkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA+7G3e8=&'
享受。
答案 3 :(得分:1)
var = "VAR=s2P0n6I%2Flonpj6uCKvYn8PCjp%2F4PUE2TPsltCdmA%3DRQPY%3D&"
var = var.replace("%2F", "/")
var = var.replace("%2B", "+")
var = var.replace("%3D", "=")
但你用urllib2.unquote获得了相同的结果
import urllib2
var = "VAR=s2P0n6I%2Flonpj6uCKvYn8PCjp%2F4PUE2TPsltCdmA%3DRQPY%3D&"
var = urllib2.unquote(var)
答案 4 :(得分:0)
这不能用正则表达式完成,因为没有办法在正则表达式中编写任何类型的条件。正则表达式只能回答“这个字符串匹配这个模式吗?”的问题。并且不执行操作“如果此字符串与此模式匹配,请将其替换为此部分。如果它与此模式匹配,请将其替换为此等。”