python
  • regex
  • django
  • 2012-11-29 81 views 3 likes 
    3

    我想將我的網頁中的所有WikiLink類型的字符串(在django中創建)轉換爲html鏈接。python 2.7+中無效的組引用

    我使用下面的表達式

    import re 
    expr = r'\s+[A-Z][a-z]+[A-Z][a-z]+\s' 
    repl=r'<a href="/photos/\1">\1</a>' 
    mystr = 'this is a string to Test whether WikiLink will work ProPerly' 
    
    parser=re.compile(expr) 
    parser.sub(repl, mystr) 
    

    這將返回我下面的字符串替換爲的字符串十六進制值。

    "this is a string to Test whether<a href='/mywiki/\x01>\x01</a>'will work<a href='/mywiki/\x01>\x01</a>'" 
    

    綜觀python help爲應用re.sub,我試圖改變\ 1至\克< 1>但是,在一個無效的組參考錯誤的結果。

    請幫助我瞭解如何得到這個工作

    回答

    15

    的這裏的問題是,你沒有在任何expr捕獲組。

    無論比賽的任何部分你想顯示爲\1,你需要放在括號內。例如:

    >>> expr = r'\s+([A-Z][a-z]+[A-Z][a-z]+)\s' 
    >>> parser=re.compile(expr) 
    >>> parser.sub(repl, mystr) 
    'this is a string to Test whether<a href="/photos/WikiLink">WikiLink</a>will work ProPerly' 
    

    反向引用\1指匹配內的組1,其是相匹配的第一個括號的子表達式的部分。同樣,\2是組2,匹配第二個加括號的子表達式的部分,依此類推。如果您的組數少於1時使用\1,某些正則表達式引擎會給您一個錯誤,其他正則表達式會使用文字'\1'字符ctrl-A; Python做後者,而ctrl-A的規範表示是'\x01',所以你就是這麼看的。

    0組是整個比賽。但在這種情況下,這不是你想要的,因爲你不希望空格成爲替代的一部分。

    您需要g語法的唯一原因是當簡單的反向引用不明確時。例如,如果子是123\1456,有沒有辦法告訴這是否意味着123,其次爲1組,其次爲456,或123其次組1456,或...

    Further reading on grouping and backreferences.

    +1

    感謝您的解釋。添加paranthesis()解決了我的問題。 –

    +0

    感謝@ m.buettner的偉大鏈接。如果他在編輯之前添加了評論,我會爲其+1。 – abarnert

    相關問題