繁体   English   中英

正则表达式用于多个搜索和替换

[英]RegEx For Multiple 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=&

我不认为您需要使用正则表达式,但是使用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=&

在您的示例中,无需使用正则表达式。 一个简单的替换方法可以做到:

def rep(s):
    for pat, txt in [['%2F','/'], ['%2B','+'], ['%3D','='], ['%23','#']]:
        s = s.replace(pat, txt)
    return s

我也不确信您需要正则表达式,但是有一种更好的方法可以使用正则表达式进行url解码。 基本上,您需要将%XX模式中的每个字符串都转换为它表示的char。 可以使用re.sub()来完成,如下所示:

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

请享用。

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)

使用正则表达式无法做到这一点,因为无法在正则表达式内部编写任何类型的条件。 正则表达式只能回答以下问题:“此字符串是否匹配此模式?” 并且不执行操作“如果此字符串匹配此模式,则用此模式替换它的一部分。如果它匹配此模式,则用此模式替换。等...”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM