Gab*_*lis 2 python regex unicode utf-8
我使用 Python 2.7 使用 Google App Engine,以下是代码片段:
\n\n# -*- coding: utf-8 -*-\nKEYWORD = u"\xe8\x8b\xb1\xe8\xaa\x9e"\nURL = u"http://www.google.com/"\ncontent = u"\xe5\x92\x8c\xe8\xa3\xbd\xe8\x8b\xb1\xe8\xaa\x9e\xef\xbc\x88\xe3\x82\x8f\xe3\x81\x9b\xe3\x81\x84\xe3\x81\x88\xe3\x81\x84\xe3\x81\x94\xef\xbc\x89\xe3\x81\xa8\xe3\x81\xaf\xe3\x80\x81\xe6\x97\xa5\xe6\x9c\xac\xe3\x81\xa7\xe4\xbd\x9c\xe3\x82\x89\xe3\x82\x8c\xe3\x81\x9f\xe8\x8b\xb1\xe8\xaa\x9e\xe9\xa2\xa8\xe3\x81\xae\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\xe8\xaa\x9e\xe5\xbd\x99\xe3\x81\xae\xe3\x81\x93\xe3\x81\xa8\xe3\x81\xa7\xe3\x81\x82\xe3\x82\x8b\xe3\x80\x82"\np=re.compile(u\'(\'+ KEYWORD +u\')(?!(([^<>]*?)>)|([^>]*?</a>))\',re.UNICODE)\noutput=p.sub(u\'<a href="\'+ URL +\'">\\1</a>\',content)\nRun Code Online (Sandbox Code Playgroud)\n\n正则表达式和 p.sub 工作正常,但反向引用\\1不起作用!的输出\\1是这样的:\xe1\x9e\x93
我尝试修改代码,encode(\'utf-8\')但结果是一样的:
p=re.compile(u\'(\'+ KEYWORD +u\')(?!(([^<>]*?)>)|([^>]*?</a>))\'.encode(\'utf-8\'),re.UNICODE)\noutput=p.sub(u\'<a href="\'+ URL +\'">\\1</a>\'.encode(\'utf-8\'),content.encode(\'utf-8\'))\nRun Code Online (Sandbox Code Playgroud)\n\n谁能告诉我出了什么问题吗?
\n通过在字符串前面\\1添加一个,将字符串转为原始字符串:r
output=p.sub(u\'<a href="\'+ URL +r\'">\\1</a>\',content)\nRun Code Online (Sandbox Code Playgroud)\n\n这可以防止 1 被解释为反向引用 1。证明:
\n\n# -*- coding: utf-8 -*-\nimport re\nKEYWORD = u"\xe8\x8b\xb1\xe8\xaa\x9e"\nURL = u"http://www.google.com/"\ncontent = u"\xe5\x92\x8c\xe8\xa3\xbd\xe8\x8b\xb1\xe8\xaa\x9e\xef\xbc\x88\xe3\x82\x8f\xe3\x81\x9b\xe3\x81\x84\xe3\x81\x88\xe3\x81\x84\xe3\x81\x94\xef\xbc\x89\xe3\x81\xa8\xe3\x81\xaf\xe3\x80\x81\xe6\x97\xa5\xe6\x9c\xac\xe3\x81\xa7\xe4\xbd\x9c\xe3\x82\x89\xe3\x82\x8c\xe3\x81\x9f\xe8\x8b\xb1\xe8\xaa\x9e\xe9\xa2\xa8\xe3\x81\xae\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\xe8\xaa\x9e\xe5\xbd\x99\xe3\x81\xae\xe3\x81\x93\xe3\x81\xa8\xe3\x81\xa7\xe3\x81\x82\xe3\x82\x8b\xe3\x80\x82"\np=re.compile(u\'(\'+ KEYWORD +u\')(?!(([^<>]*?)>)|([^>]*?</a>))\',re.UNICODE)\nprint p.sub(u\'<a href="\'+ URL +\'">\\1</a>\',content)\nprint p.sub(u\'<a href="\'+ URL +r\'">\\1</a>\',content)\nRun Code Online (Sandbox Code Playgroud)\n\n印刷
\n\n\xe5\x92\x8c\xe8\xa3\xbd<a href="http://www.google.com/"></a>\xef\xbc\x88\xe3\x82\x8f\xe3\x81\x9b\xe3\x81\x84\xe3\x81\x88\xe3\x81\x84\xe3\x81\x94\xef\xbc\x89\xe3\x81\xa8\xe3\x81\xaf\xe3\x80\x81\xe6\x97\xa5\xe6\x9c\xac\xe3\x81\xa7\xe4\xbd\x9c\xe3\x82\x89\xe3\x82\x8c\xe3\x81\x9f<a href="http://www.google.com/"></a>\xe9\xa2\xa8\xe3\x81\xae\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\xe8\xaa\x9e\xe5\xbd\x99\xe3\x81\xae\xe3\x81\x93\xe3\x81\xa8\xe3\x81\xa7\xe3\x81\x82\xe3\x82\x8b\xe3\x80\x82\n\xe5\x92\x8c\xe8\xa3\xbd<a href="http://www.google.com/">\xe8\x8b\xb1\xe8\xaa\x9e</a>\xef\xbc\x88\xe3\x82\x8f\xe3\x81\x9b\xe3\x81\x84\xe3\x81\x88\xe3\x81\x84\xe3\x81\x94\xef\xbc\x89\xe3\x81\xa8\xe3\x81\xaf\xe3\x80\x81\xe6\x97\xa5\xe6\x9c\xac\xe3\x81\xa7\xe4\xbd\x9c\xe3\x82\x89\xe3\x82\x8c\xe3\x81\x9f<a href="http://www.google.com/">\xe8\x8b\xb1\xe8\xaa\x9e</a>\xe9\xa2\xa8\xe3\x81\xae\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\xe8\xaa\x9e\xe5\xbd\x99\xe3\x81\xae\xe3\x81\x93\xe3\x81\xa8\xe3\x81\xa7\xe3\x81\x82\xe3\x82\x8b\xe3\x80\x82\nRun Code Online (Sandbox Code Playgroud)\n\n只有后者有效(\xe8\x8b\xb1\xe8\xaa\x9e 在谷歌链接内)。
\n