在Python3中使用反斜杠的正则表达式

时间:2018-06-12 04:44:10

标签: regex python-3.x

我正在尝试将一个字符串中的特定子字符串与正则表达式匹配,例如匹配"\ue04a"中的"\ue04a abc"。但似乎有些不对劲。这是我的代码:

m = re.match('\\([ue]+\d+[a-z]+)', "\ue04a abc").

返回的m是一个空对象,即使我尝试在模式中使用三个反斜杠。怎么了?

2 个答案:

答案 0 :(得分:1)

这应该有所帮助。

import re
m = re.match(r'(\\ue\d+[a-z]+)', r"\ue04a abc")
if m:
    print( m.group() )

<强>输出:

\ue04a

答案 1 :(得分:1)

Python中正则表达式中的反斜杠非常棘手。使用常规字符串(单引号或三引号)时,有两个反斜杠解释:首先,Python本身解释反斜杠(所以"\t"表示单个字符,文字选项卡)然后将结果传递给正则表达式引擎,对于任何剩余的反斜杠都有自己的语义。

通常,强烈建议使用r"\t",因为这会删除Python字符串解析方面。这个带有r前缀的字符串不经过Python的解释 - 字符串中的每个字符都只代表自己,包括反斜杠。因此,此特定示例表示长度为2的字符串,其中包含文字字符反斜杠\t

从您的问题中不清楚目标字符串"\ue04a abc"是否应该被解释为长度为5的字符串,其中包含Unicode字符U+E04A(位于Private Use Area中,又名PUA,意思是它没有任何特定的标准用途)后跟空格,abc - 在这种情况下你会使用像

m = re.match(r'[\ue000-\uf8ff]', "\ue04a abc")

捕获传统Basic Multilingual Plane PUA中的任何单个代码点; - 或者如果要匹配以两个字符反斜杠\u开头的文字字符串,后跟四个十六进制数字:

m = re.match(r'\\u[0-9a-fA-F]{4}', r"\ue04a abc")

前者是Python(以及大多数Python程序员)如何理解你的问题,但这两种解释都是合理的。

以上显示如何匹配&#34;神秘序列&#34; "\ue04a";因此,不应该扩展代码以匹配包含此序列的较长字符串。