2013-09-15 4 views
1

Я пытаюсь сделать поиск и замену (для нескольких символов) в следующей строке:RegEx для нескольких Поиск и замена

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

На каком языке вы это делаете? Возможно, ваш язык имеет родной путь к urldecode. –

+0

Я уверен, что регулярное выражение не может этого сделать. – Dukeling

+0

Одно регулярное выражение? Вам понадобится функция, чтобы выбрать, какой набор символов заменить с соответствующим набором символов. – Jerry

ответ

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

Это здорово, и я мог бы следить за тем, что вы сделали, но есть ли способ сделать это, используя какое-то пятно regex или это просто невозможно? Приветствие! –

+0

Посмотрите на мой ответ, это то, что вы называете «пятно»? –

+0

@MyPM: поскольку нет простого метода для преобразования шестнадцатеричных чисел в символы с помощью механизма регулярных выражений Python, нет. Вам всегда нужно использовать такую ​​функцию, как Ofir, и я сделал или использовал несколько заметок, подобных CodeChords. – Wolph

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) 
2

Нет необходимости в регулярном выражении, чтобы сделать это в вашем примере. Простой метод замены будет делать:

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

Спасибо, Брат. Я дам ему попробовать. –

2

Я также не уверен, что вам нужно регулярное выражение, но есть лучший способ сделать URL-расшифровывает с регулярным выражением. В основном вам нужно, чтобы каждая строка в шаблоне % XX была преобразована в символ, который она представляет. Это можно сделать с re.sub() следующим образом:

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

Наслаждайтесь.

+0

Спасибо, ребята! Я постараюсь заставить это работать и отчитываться! Ура! –

0

Это не может быть сделано с помощью регулярного выражения, потому что нет никакого способа написать какой-либо условный код внутри регулярного выражения. Регулярные выражения могут отвечать только на вопрос: «Соответствует ли эта строка этому шаблону?» и не выполняйте операцию «Если эта строка соответствует этому шаблону, замените ее частью. Если она соответствует этому шаблону, замените его на это. etc ...»

Смежные вопросы