RegEx For Multiple Search&更换

时间:2013-09-15 20:17:53

标签: python regex search replace

我正在尝试搜索并替换(对于多个字符)以下字符串:

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=&

5 个答案:

答案 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)

这不能用正则表达式完成,因为没有办法在正则表达式中编写任何类型的条件。正则表达式只能回答“这个字符串匹配这个模式吗?”的问题。并且不执行操作“如果此字符串与此模式匹配,请将其替换为此部分。如果它与此模式匹配,请将其替换为此等。”