具有unicode范围的Python正则表达式匹配不在范围内的字符

时间:2014-02-02 21:14:21

标签: python regex unicode python-unicode

我正在使用正则表达式从文本中删除“子弹点”。这些项目符号通常是在unicode范围内找到的符号,例如几何形状(\ u25a0- \ u25ff)或类似物。以下是这种子弹的一个例子:

 ◉ This is a bullet
 ♦︎ This is also a bullet
 ☉ And so is this

This is not a bullet.

我正在使用以下正则表达式来匹配这些要点:

\s*([\u00a4\u00b7]|[\u2010-\u2017]|[\u2020-\u206f]|[\u2300-\u23f3]|[\u25a0-\u25ff]|[\u2600-\u26ff]|[\u2700-\u27bf]|[\u2b00-\u2bff])\s*

这适用于Ruby(参见http://rubular.com/r/O7ZObURmlt的示例),但在Python中它匹配任何字符串的第一个字符。例如,字符串T中的This is not a bullet字符匹配。您可以将上面的正则表达式和示例文本复制到http://www.pythonregex.com/以便自己查看。

使用UNICODE标志编译正则表达式。

如何让Python的正则表达式引擎在这个表达式中发挥出色?

1 个答案:

答案 0 :(得分:1)

使生成表达式的字符串为unicode,以便将序列解释为unicode字符,而不是普通u20等。请尝试以下方法:

regex = re.compile(u"\s*([\u00a4\u00b7]|[\u2010-\u2017]|" + \
    "[\u2020-\u206f]|[\u2300-\u23f3]|[\u25a0-\u25ff]|" + \
    "[\u2600-\u26ff]|[\u2700-\u27bf]|[\u2b00-\u2bff])\s*", re.UNICODE)

你很可能不使用Python 3. *,其中所有字符串都是unicode AFAIK。