2014-06-21 18 views
0

給定一個像r'a(\ w +)regex這樣的正則表達式,我知道我可以捕獲這個組,但是如果給出了一個捕獲的組,我想將它歸爲正則表達式。我在下面列出了一個我已經構建的功能,但是因爲我不是正則表達式的專家,所以我想知道是否有更標準的此類行爲實現,或者「最佳實踐」是什麼。將捕獲的組分回到Python正則表達式的最佳方式是什麼?

def reverse_capture(regex_string, args, kwargs): 
    regex_string = str(regex_string) 
    if not args and not kwargs : 
     raise ValueError("at least one of args or kwargs must be empty in reverse_capture") 
    if kwargs : 
     for kwarg in kwargs : 
      regex_string = re.sub(r'(?:[^\\[]|[^\\](?:\\\\)+|[^\\](?:\\\\)*\\\[)\(\?P<.+>.+(?:[^\\[]|[^\\](?:\\\\)+|[^\\](?:\\\\)*\\\[)\)', 
            kwarg, 
            regex_string) 
    elif args : 
     for arg in args : 
      regex_string = re.sub(r'(?:[^\\[]|[^\\](?:\\\\)+|[^\\](?:\\\\)*\\\[)\(.+(?:[^\\[]|[^\\](?:\\\\)+|[^\\](?:\\\\)*\\\[)\)', 
            arg, 
            regex_string) 
    else : 
     return regex_string 

注:以上功​​能實際上並沒有工作,但因爲我想通之前,我嘗試覆蓋每一個情況下,我應該問在這個網站。

編輯:

我想我要澄清我的意思了一下。我的目標是編寫Python功能使得在給定像R「AB(+)。C」等,「一些字符串」自變量的正則表達式,我們可以有以下幾種:

>>> def reverse_capture(r"ab(.+)c", "Some strinG") 
"abSome strinGc" 

那就是說,這個論點將被代入捕獲組的正則表達式。確實有更好的方法來格式化字符串。然而,正則表達式在我的用例中給出,所以這不是一個選項。

對於任何人誰好奇,我想要做的是創建一個Django包,將使用模板標籤來查找與某些視圖函數或命名的url關聯的正則表達式,可選地輸入一些參數,然後檢查如果從模板訪問的網址與標籤生成的網址匹配。這將解決一些導航問題。有一個更簡單的軟件包可以做類似的事情,但它不適合我的用例。

例子:

如果reverse_capture是我想寫的功能,然後在這裏輸入/輸出(I傳中,正則表達式用原始字符串)的一些例子,以及函數調用:

reverse_capture:正則表達式串 - >正則表達式 輸入:一個正則表達式和一個字符串 輸出:通過替換正則表達式,其參數,字符串的第一個捕獲組中獲得的正則表達式。

例子:

>>> reverse_capture(r'(.+)', 'TEST') 
'TEST' 
>>> reverse_capture(r'a longer (.+) regex', 'TEST') 
'a longer TEST regex' 
>>> reverse_capture(r'regex with two (.+) capture groups(.+)', 'TEST') 
'regex with two TEST capture groups(.+)' 
+0

也許有一個更好的方法來做到這一點,但在確保整個表達式不在括號內,您發現的括號被轉義,它們的轉義字符本身沒有被轉義之間,等等......您可以想象這會變得有點混亂! – Nick

+0

做一個小例子,做你想做的一部分。當你的意圖不清楚時,要求人們看看這個瘋狂的逃跑可能會被忽略。 – msw

+0

與其試圖解析正則表達式以找出捕獲組的位置,爲什麼不使用字符串格式將文本放置在捕獲組需要去的地方? – user2357112

回答

0

對於任何未來遇到此問題的人來說,在我搜索周圍後,似乎沒有好的庫函數來將值替換爲正則表達式的捕獲組。

解決此問題的最簡單方法/編寫您自己的功能,是製作DFA(Deterministic Finite Automaton),這不是很難。

如果您決定使用正則表達式解決此問題,那麼您可以使用answers to this question將您的DFA轉換爲正則表達式,這就是我最終實現自己的解決方案的方式。

3

解析正則表達式可以是一種複雜。與其試圖解析正則表達式以找出需要替換匹配的位置,爲什麼不從格式化字符串構建正則表達式,並使用方便的位置將字符串格式化爲正確的匹配?

下面是一個例子模板:

>>> regex_template = r'{} lives at {} Baker Street.' 

我們插入捕獲組來構建正則表達式:

>>> import re 
>>> word_group = r'(\w+)' 
>>> digit_group = r'(\d+)' 
>>> regex = regex_template.format(word_group, digit_group) 

匹配一個字符串:

>>> groups = re.match(regex, 'Alfred lives at 325 Baker Street.').groups() 
>>> groups 
('Alfred', '325') 

和字符串格式化匹配到位:

>>> regex_template.format(*groups) 
'Alfred lives at 325 Baker Street.' 
+0

謝謝,我認爲這對大多數用例來說都是一個很好的解決方案,但不幸的是我不會構造正則表達式。雖然我理論上可以與所有正則表達式並行地構建格式化字符串,因爲我想將其作爲一個包發佈,如果我想要在正則表達式本身上執行,我認爲這會節省大量時間/代碼。 – Nick

相關問題