python
  • regex
  • django
  • 2012-11-29 47 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

    相关问题