【问题标题】:Python regex with unicode ranges matches characters not in range具有 unicode 范围的 Python 正则表达式匹配不在范围内的字符
【发布时间】:2014-02-26 06:55:16
【问题描述】:

我正在使用正则表达式从文本中去除“要点”。这些项目符号点通常是 unicode 范围内的符号,例如几何形状 (\u25a0-\u25ff) 或类似符号。以下是此类项目符号的示例:

◉ 这是一颗子弹 ♦︎这也是一颗子弹 ☉ 这个也是 这不是子弹。

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

\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 中,它匹配任何字符串的第一个字符。例如,字符串This is not a bullet 中的T 字符匹配。您可以将上述正则表达式和示例文本复制到http://www.pythonregex.com/ 以自己查看。

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

如何让 Python 的正则表达式引擎与这个表达式配合得很好?

【问题讨论】:

标签: python regex unicode python-unicode


【解决方案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。

【讨论】:

  • 或者换句话说[0-u]的范围匹配了很多东西。
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多