2012-11-07 15 views
7

Chciałbym wypełnić zmienne regex ciągiem.W jaki sposób wypełnić ciąg regex o parametrach

import re 

hReg = re.compile("/robert/(?P<action>([a-zA-Z0-9]*))/$") 
hMatch = hReg.match("/robert/delete/") 
args = hMatch.groupdict() 

zmienna args jest teraz dict z {"action": "delete"}.

Jak mogę odwrócić ten proces? W jaki sposób mogę uzyskać ciąg "/ robert/delete /" z args dict i regex pattern?

Czy możliwe jest posiadanie takiej funkcji?

def reverse(pattern, dictArgs): 

Dziękuję

+0

Jeśli masz słownika wartości, które opisują swój ciąg w stopniu, że jesteś nim zainteresowany ... Dlaczego trzeba regex, aby ponownie zbudować ten ciąg? Masz już wszystkie bity, które mają znaczenie. Wystarczy napisać funkcję, która pobiera te bity i tworzy ciąg znaków. (Innymi słowy, nie jest to możliwe i prawdopodobnie tracisz czas na próbowanie.) – Tomalak

+0

Chciałbym, aby ta "funkcja" zaimplementowała funkcję typu reverse() używaną w Django, aby uzyskać ciąg URL. Możliwe jest, że Django po prostu "brutalny-force" z args? – 0xBAADF00D

+1

Jeśli w ogóle jest to rzecz Pythona, a nie Django. Ale chodzi mi o to. W jaki sposób odwrócisz, na przykład, '"/robe [lub] t?/(? P ((?! Foo) [a-zA-Z0-9] *)) "'? Nie ma sposobu, aby przejść z listy dopasowań z powrotem do oryginalnego ciągu, ponieważ wyrażenie regularne zawiera części opcjonalne i warunkowe, które zależą od siebie nawzajem. Tak więc albo definiujesz * wyjątkowo * wąski podzbiór wyrażenia regularnego, który jest dozwolony, i zapisujesz dla niego parser, prawdopodobnie wciąż brakuje niektórych przypadków bocznych i poważnie ograniczasz się - lub spędzisz czas bardziej produktywnie. ;) Dopasowanie Regex jest ulicą jednokierunkową. – Tomalak

Odpowiedz

2

Funkcja ta powinna zrobić to

def reverse(regex, dict): 
    replacer_regex = re.compile(''' 
     \(\?P\<   # Match the opening 
      (.+?)  # Match the group name into group 1 
     \>\(.*?\)\)  # Match the rest 
     ''' 
     , re.VERBOSE) 

    return replacer_regex.sub(lambda m : dict[m.group(1)], regex) 

Zasadniczo dopasować (\? P ...) blok i wymień ją na wartość od dict.

EDYCJA: regex to ciąg regex w moim przykładzie. Można go pobrać z tupot przez

regex_compiled.pattern 

Edit2: gadatliwy regex dodany

+0

ta funkcja działa dobrze w moim projekcie, dziękuję! – 0xBAADF00D

0

Właściwie i uważa, że ​​to wykonalne dla niektórych wąskich przypadkach, ale dość skomplikowana sprawa „w ogólnym przypadku”.

Musisz napisać jakiś skończony automat stanów, analizować łańcuch regex i dzielić różne części, a następnie podjąć odpowiednie działanie dla tych części.

Dla zwykłych symboli - po prostu umieść symbole "jak jest" w ciągu wyników. Dla nazwanych grup - wpisz wartości z dictArgs zamiast ich Dla opcjonalnych bloków - umieść niektóre z jego wartości

I tak dalej.

Jedno wyrażenie requllar często może dorównać dużemu (lub nawet nieskończonemu) zestawowi łańcuchów, więc ta funkcja "wsteczna" nie byłaby bardzo przydatna.

Powiązane problemy