【问题标题】:Python Regex - Matching mixed Unicode and ASCII characters in a stringPython Regex - 匹配字符串中的混合 Unicode 和 ASCII 字符
【发布时间】:2017-08-11 04:10:52
【问题描述】:

我尝试了几种不同的方法,但都没有奏效。

假设我有一个字符串 s 定义如下:

s = '[မန္း],[aa]'.decode('utf-8')

假设我想解析方括号内的两个字符串。我编译了以下正则表达式:

pattern = re.compile(r'\[(\w+)\]', re.UNICODE)

然后我使用以下方法查找事件:

pattern.findall(s, re.UNICODE)

结果基本上只是[],而不是预期的两个匹配项列表。此外,如果我从 findall 调用中删除 re.UNICODE,我会得到单个字符串 [u'aa'],即非 unicode 字符串:

pattern.findall(s)

当然

s = '[bb],[aa]'.decode('utf-8')
pattern.findall(s)

返回[u'bb', u'aa']

让事情变得更有趣:

s = '[မနbb],[aa]'.decode('utf-8')
pattern.findall(s)

返回[u'\u1019\u1014bb', u'aa']

【问题讨论】:

  • 什么是'd' in s = '[မန်း],[aa]'.d.decode('utf-8') ...不应该是s = '[မန်း] ,[aa]'.decode('utf-8') ?
  • python3 不支持s = '[bb],[aa]'.decode('utf-8')。您使用的是哪个 python 版本。
  • print(s) 提供了什么?

标签: python regex string python-2.7 unicode


【解决方案1】:

其实很简单。 \w 匹配所有 字母数字 字符,并且初始字符串中并非所有字符都是字母数字。

如果您仍想匹配括号之间的所有字符,一种解决方案是匹配除右括号 (]) 之外的所有字符。这可以做成

import re
s = '[မန္း],[aa]'.decode('utf-8')
pattern = re.compile('\[([^]]+)\]', re.UNICODE)
re.findall(pattern, s)

[^]] 会创建一个匹配所有字符的模式,除了抑扬符 (^) 字符之后的字符。

另外,请注意 re.compilere.UNICODE 参数不是必需的,因为模式本身不包含任何 unicode 字符。

【讨论】:

  • re.UNICODE 不是必需的,因为它不包含用于重新定义其行为的速记字符类。
  • @WiktorStribiżew 好的,我的 unicode 知识有限。您能否再解释一下,以便我可以正确更新我的答案(并学习新的东西。:-))
【解决方案2】:

首先,请注意,如果您已将源文件保存为 UTF-8 编码,并且您在文件顶部声明了源代码编码,则以下内容仅适用于 Python 2.x;否则,源的默认编码假定为ascii

#coding: utf8
s = '[မန္း],[aa]'.decode('utf-8')

一种更短的编写方法是直接编写一个 Unicode 字符串:

#coding: utf8
s = u'[မန္း],[aa]'

接下来,\w 匹配字母数字字符。使用re.UNICODE 标志,它匹配在Unicode 数据库中归类为字母数字的字符。 并非မန္း 中的所有字符都是字母数字。如果您想要括号之间的任何内容,请使用以下内容。请注意使用.*? 对所有内容进行非贪婪匹配。对所有文本使用 Unicode 字符串也是一个好习惯,尤其是对正则表达式使用原始字符串。

#coding:utf8
import re
s = u'[မန္း],[aa],[မနbb]'
pattern = re.compile(ur'\[(.*?)\]')
print re.findall(pattern,s)

输出:

[u'\u1019\u1014\u1039\u1038', u'aa', u'\u1019\u1014bb']

请注意,Python 2 在列表中显示字符串的明确版本,并带有非 ASCII 和不可打印字符的转义码。

要查看实际的字符串内容,请打印字符串,而不是列表:

for item in re.findall(pattern,s):
    print item

输出:

မန္း
aa
မနbb

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2020-11-13
    • 2014-08-05
    • 2015-03-23
    • 2015-05-06
    相关资源
    最近更新 更多