【问题标题】:Invalid group reference in python 2.7+python 2.7+中的无效组引用
【发布时间】:2012-11-18 04:09:06
【问题描述】:

我正在尝试将我网页中的所有 WikiLink 类型的字符串(在 django 中创建)转换为 html 链接。

我正在使用以下表达式

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 更改为\g,但这会导致无效的组引用错误。

请帮助我了解如何使其正常工作

【问题讨论】:

    标签: python regex django


    【解决方案1】:

    这里的问题是您在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 语法的唯一原因是当一个简单的反向引用不明确时。例如,如果 sub 是 123\1456,则无法判断这是否意味着 123,后跟第 1 组,后跟 456,或 123,后跟第 1456 组,还是……

    Further reading on grouping and backreferences.

    【讨论】:

    • 感谢您的解释。添加括号 ( ) 解决了我的问题。
    • 感谢@m.buettner 提供了很棒的链接。如果他在编辑之前添加了评论,我会 +1 的。
    猜你喜欢
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多