我正在尝试将我的网页中的所有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&lt; 1&gt;但这会导致无效的组引用错误。
请帮助我了解如何使其正常工作
答案 0 :(得分:18)
这里的问题是您在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,或......