1

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

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

5 回答 5

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=&
于 2013-09-15T20:45:27.020 回答
2

在您的示例中,不需要正则表达式来执行此操作。一个简单的替换方法就可以了:

def rep(s):
    for pat, txt in [['%2F','/'], ['%2B','+'], ['%3D','='], ['%23','#']]:
        s = s.replace(pat, txt)
    return s
于 2013-09-15T20:49:13.343 回答
2

我也不相信您需要正则表达式,但有一种更好的方法可以使用正则表达式进行 url-decode。基本上,您需要将%XX模式中的每个字符串都转换为它所代表的字符。这可以这样做re.sub()

>>> VAR="%2FlkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA%2B7G3e8%3D&"
>>> re.sub(r'%..', lambda x: chr(int(x.group()[1:], 16)), VAR)
'/lkdMu9zkpE8w7UKDOtkkHhJlYZ6CaEaxqmsA+7G3e8=&'

享受。

于 2013-09-15T20:51:19.757 回答
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)
于 2013-09-15T20:48:12.783 回答
-1

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

于 2013-09-15T20:53:49.780 回答