【问题标题】:Regular expression with backslash in Python3Python3中带反斜杠的正则表达式
【发布时间】:2018-06-12 04:44:10
【问题描述】:

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

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

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

【问题讨论】:

  • "\ue04a abc" == " abc" -- 字符串中没有实际的反斜杠
  • @Rakesh 谢谢,但它不起作用。

标签: regex python-3.x


【解决方案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 程序员)如何理解您的问题,但两种解释都是合理的。

以上展示了如何匹配“神秘序列”"\ue04a";那么扩展代码以匹配包含此序列的更长字符串应该不难。

【讨论】:

  • 我看到了不同之处。子字符串应被解释为 unicode 子字符串。谢谢!
【解决方案2】:

这应该会有所帮助。

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

输出:

\ue04a

【讨论】:

  • m 还是空的。我正在使用 Python 3.6。
  • 在""\ue04a abc""前添加r
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多