Python2.7中的组引用无效+

2024-06-28 19:36:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将我的网页(在django中创建)中所有WikiLink类型的字符串转换为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>'"

查看re.sub的python help,我试图将\1更改为\g<;1>;,但这会导致无效的组引用错误。

请帮助我理解如何让这个工作


Tags: to字符串testrestringisthisrepl
1条回答
网友
1楼 · 发布于 2024-06-28 19:36:22

这里的问题是在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,一些regexp引擎会给您一个错误,其他的会使用一个文本'\1'字符,一个ctrl-a;Python会执行后者,而ctrl-a的规范表示是'\x01',因此您会这样看。

组0是整个匹配项。但在这种情况下,这不是您想要的,因为您不希望空格成为替换的一部分。

您需要g语法的唯一原因是当一个简单的反向引用不明确时。例如,如果sub是123\1456,则无法判断它是指123,然后是第1组,然后是456,还是123,然后是第1456组,或者

Further reading on grouping and backreferences.

相关问题 更多 >