使用Python的Python正则表达式的BackReference

时间:2012-08-24 09:25:59

标签: python regex unicode utf-8

我在使用Python 2.7的Google App Engine上,这是代码片段:

# -*- coding: utf-8 -*-
KEYWORD = u"英語"
URL = u"http://www.google.com/"
content = u"和製英語(わせいえいご)とは、日本で作られた英語風の日本語語彙のことである。"
p=re.compile(u'('+ KEYWORD +u')(?!(([^<>]*?)>)|([^>]*?</a>))',re.UNICODE)
output=p.sub(u'<a href="'+ URL +'">\1</a>',content)

正则表达式和p.sub工作正常,但反向引用\1不起作用! \1的输出是这样的:

我尝试使用encode('utf-8')修改代码,但结果是相同的:

p=re.compile(u'('+ KEYWORD +u')(?!(([^<>]*?)>)|([^>]*?</a>))'.encode('utf-8'),re.UNICODE)
output=p.sub(u'<a href="'+ URL +'">\1</a>'.encode('utf-8'),content.encode('utf-8'))

有谁能告诉我出了什么问题?

1 个答案:

答案 0 :(得分:4)

\1的字符串转换为原始字符串,方法是在其前面添加r

output=p.sub(u'<a href="'+ URL +r'">\1</a>',content)

这可以防止1被解释为反向引用1.证明:

# -*- coding: utf-8 -*-
import re
KEYWORD = u"英語"
URL = u"http://www.google.com/"
content = u"和製英語(わせいえいご)とは、日本で作られた英語風の日本語語彙のことである。"
p=re.compile(u'('+ KEYWORD +u')(?!(([^<>]*?)>)|([^>]*?</a>))',re.UNICODE)
print p.sub(u'<a href="'+ URL +'">\1</a>',content)
print p.sub(u'<a href="'+ URL +r'">\1</a>',content)

打印

和製<a href="http://www.google.com/"></a>(わせいえいご)とは、日本で作られた<a href="http://www.google.com/"></a>風の日本語語彙のことである。
和製<a href="http://www.google.com/">英語</a>(わせいえいご)とは、日本で作られた<a href="http://www.google.com/">英語</a>風の日本語語彙のことである。

只有后者有效(英语在谷歌链接中)。