【问题标题】:How do I process a regular expression having unicode in Python?如何在 Python 中处理具有 unicode 的正则表达式?
【发布时间】:2014-04-01 11:01:51
【问题描述】:

所以,我在 Python 中有这个字符串 str = u'world-weather-online®_jkpahjicmehopmlkbenbkmckcedlcmhk',我只想使用正则表达式提取其中的 world-weather-online® 部分。我所做的首先是match = re.search(r'([a-zA-Z0-9\-\%\+]+?)_[a-z]+', str),然后在字符串str2 = match.group(1) 中得到结果。

但是,我最终得到了错误'NoneType' object has no attribute 'group'。如果我只是尝试使用字符串“world-weather-online_jkpahjicmehop​​mlkbenbkmckcedlcmhk”,它就可以正常工作。但是,使用特殊的 unicode 符号会产生问题。我尝试使用match = re.search(ur'([a-zA-Z0-9\-\%\+]+?)_[a-z]+', str),但它仍然没有帮助。关于如何解决这个问题的任何想法?谢谢!

【问题讨论】:

  • 您的意思是您有一个 bytestring 的代码点超出 ASCII 范围?或者你有 unicode 字符串对象 (u'world-weather-online®_jkpahjicmehopmlkbenbkmckcedlcmhk)?
  • 没有特殊的unicode符号这样的东西;您的所有文本都是 unicode 代码点,其中大部分在 ASCII 范围内。
  • 我有一个 Unicode 字符串对象。
  • 注意:不要使用str作为变量名;您正在掩盖内置类型。

标签: python regex string unicode


【解决方案1】:

使用 Unicode 正则表达式并在您的模式中包含代码点:

match = re.search(ur'([a-zA-Z0-9®%+-]+?)_[a-z]+', yourstr)

您可能需要考虑应该包含哪些其他代码点,除了商标® 代码点。

演示:

>>> import re
>>> yourstr = u'world-weather-online®_jkpahjicmehopmlkbenbkmckcedlcmhk'
>>> print re.search(ur'([a-zA-Z0-9®%+-]+?)_[a-z]+', yourstr).group(1)
world-weather-online®

【讨论】:

  • @TheRookierLearner:您确定您的yourstr 输入值是unicode 对象吗?你是如何打印输出的?
  • 我实际上使用了yourstr = 'world-weather-online®_jkpahjicmehopmlkbenbkmckcedlcmhk' 而不是yourstr = u'world-weather-online®_jkpahjicmehopmlkbenbkmckcedlcmhk',但我不明白其中的区别。我实际上是从数据库中获取这个值(可能这就是它不起作用的原因),我认为 Python 总是将它的字符串存储在 unicode 中。
  • 糟糕的是,我最初在我的字符串上使用了urllib.quote
  • @TheRookierLearner:有一个巨大的区别; str 是(编码的)字节,unicode 对象是 Unicode。见docs.python.org/2/howto/unicode.html
  • 我想我明白了。如果str 是字符串类型而不是 unicode 对象,这可能吗?
【解决方案2】:

好吧,我认为您只是忘记了正则表达式中的 ®:

>>> match = re.search(r'([a-zA-Z0-9\-\%\+®+]+?)_[a-z]+', str)
>>> match.group(1)
u'world-weather-online\xae'

但是如果你的字符串包含更多的 unicode 字符,你的正则表达式可能会很长......所以只需 re.search(r'(.*)_[a-z]+', str) 就可以了。

如果您只想将 wrt 拆分为“_”:

>>> str.split('_')[0]
u'world-weather-online\xae'

【讨论】:

  • OP 使用什么编码?如果他们使用 UTF-8 怎么办?还是 IBM 850 编解码器?
  • 这适用于 Python 命令行,但是当我将这些行保存在文件中时,我得到 Non-ASCII character '\xc2' in file。关于如何将其保存在文件中的任何想法?
猜你喜欢
  • 2011-07-03
  • 2017-01-21
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
相关资源
最近更新 更多