2012-11-07 34 views
7

Tôi muốn điền các biến regex bằng chuỗi.Cách điền một chuỗi regex với các tham số

import re 

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

biến args bây giờ là một mệnh đề với {"action": "delete"}.

Làm cách nào tôi có thể đảo ngược quá trình này? Với args dict và mẫu regex, làm thế nào tôi có thể lấy chuỗi "/ robert/delete /"?

có thể có chức năng giống như thế này?

def reverse(pattern, dictArgs): 

Cảm ơn bạn

+0

Nếu bạn có một cuốn từ điển các giá trị mô tả chuỗi của bạn để mở rộng mà bạn quan tâm đến nó ... Tại sao bạn sẽ cần một regex để xây dựng lại chuỗi đó? Bạn đã có tất cả các bit tạo nên sự khác biệt. Chỉ cần viết một hàm nhận các bit đó và tạo một chuỗi. (Nói cách khác, không có điều này là không thể và bạn có thể lãng phí thời gian của bạn đang cố gắng.) – Tomalak

+0

Tôi muốn tính năng này "" để thực hiện một chức năng như đảo ngược() được sử dụng trong Django để có được một chuỗi URL. Có thể Django chỉ là "brute-lực lượng" mô hình với args? – 0xBAADF00D

+1

Nếu ở tất cả, đó là một điều Python, không phải là một điều Django. Nhưng quan điểm của tôi là vậy. Làm thế nào bạn sẽ đảo ngược, ví dụ, '"/robe [hoặc] t?/(? P ((?! Foo) [a-zA-Z0-9] *)) "? Không có cách nào để đi từ một danh sách các trận đấu trở lại chuỗi ban đầu bởi vì regex chứa các phần tùy chọn và có điều kiện phụ thuộc vào nhau. Vì vậy, hoặc là bạn định nghĩa một tập hợp con regex cực kỳ hẹp * được phép và viết một trình phân tích cú pháp cho điều đó, có thể vẫn thiếu một số trường hợp phụ và hạn chế nghiêm trọng bản thân bạn - hoặc bạn dành nhiều thời gian hiệu quả hơn. ;) Regex phù hợp là một con đường một chiều. – Tomalak

Trả lời

2

Chức năng này nên làm điều đó

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) 

Bạn về cơ bản phù hợp với (\? P ...) khối và thay thế nó bằng một giá trị từ dict.

EDIT: regex là chuỗi regex trong exmple của tôi. Bạn có thể lấy nó từ patter bởi

regex_compiled.pattern 

EDIT2: regex tiết thêm

+0

chức năng này hoạt động tốt trong dự án của tôi, cảm ơn bạn! – 0xBAADF00D

0

Trên thực tế, tôi nghĩ rằng nó là doable cho một số trường hợp hẹp, nhưng khá điều phức tạp "trong trường hợp tổng quát".

Bạn sẽ cần phải viết một số loại máy trạng thái hữu hạn, phân tích chuỗi regex của bạn và chia các phần khác nhau, sau đó thực hiện hành động thích hợp cho các phần này.

Đối với các ký hiệu thông thường - chỉ cần đặt ký hiệu "như là" vào chuỗi kết quả. Đối với các nhóm được đặt tên - đặt giá trị từ dictArgs thay cho chúng Đối với các khối tùy chọn - hãy đặt một số giá trị của nó

Và cứ tiếp tục như vậy.

Một biểu thức requllar thường có thể phù hợp với bộ chuỗi lớn (hoặc thậm chí vô hạn), vì vậy chức năng "đảo ngược" này sẽ không hữu ích lắm.

Các vấn đề liên quan