【问题标题】:Regexp for non-ASCII characters非 ASCII 字符的正则表达式
【发布时间】:2013-02-19 19:55:38
【问题描述】:

考虑一下在 Python 3 中使用正则表达式的 sn-p:

>>> t = "Meu cão é #paraplégico$."
>>> re.sub("[^A-Za-z0-9 ]","",t,flags=re.UNICODE)
'Meu co  paraplgico'

为什么会删除非ASCII字符?我试过不带flag,都是一样的。

作为奖励,任何人都可以在 Python 2.7 上进行这项工作吗?

【问题讨论】:

  • 我正在使用 python 3.2
  • 因为a-zabcdef...xyz,而这不包括ã。如果您想要所有单词字符,请使用\w

标签: python regex unicode python-3.x


【解决方案1】:

您正在用空白 ("") 替换非字母数字字符 ([^A-Za-z0-9 ])。非 ASCII 字符不在 A-Z、a-z 或 0-9 之间,因此它们被替换。

你可以像这样匹配所有单词字符:

>>> t = "Meu cão é #paraplégico$."
>>> re.sub("[^\w ]","",t, flags=re.UNICODE)
>>> 'Meu cão é paraplégico'

或者您可以像这样将字符添加到您的正则表达式中:[^A-Za-z0-9ãé ]

【讨论】:

  • 是的,我明白了!但是 Unicode 中的 A-Za-z 等价物是什么?
  • 在许多(其他)语言中,您可以使用 Unicode 属性来定义 [^\p{Alpha} ] 的正则表达式。请参阅stackoverflow.com/questions/1832893/… 了解 Python 中的替代方案。
【解决方案2】:
[In 1]: import regex
[In 2]: t = u"Meu cão é #paraplégico$."
[In 3]: regex.sub(r"[^\p{Alpha} ]","",t,flags=regex.UNICODE)
[In 4]: print(regex.sub(r"[^\p{Alpha} ]","",t,flags=regex.UNICODE))

Meu cãoé paraplégico

【讨论】:

    【解决方案3】:

    我通过切换到正则表达式库(来自 PyPI)解决了这个问题。

    然后正则表达式命令变为:

    regex.sub(ur"[^\p{L}\p{N} ]+", u"", t)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 2012-11-21
      • 2013-09-22
      • 2016-10-06
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多