PYTHON在匹配时不会将UNICODE字符拆分为代理项对

PYTHON在匹配时不会将UNICODE字符拆分为代理项对,python,regex,unicode,surrogate-pairs,Python,Regex,Unicode,Surrogate Pairs,谁知道,当macthing将代码点拆分为代理项对时,是否可能禁止正则表达式 请参见以下示例: 现在情况如何: $ te = u'\U0001f600\U0001f600' $ flags1 = regex.findall(".", te, re.UNICODE) $ flags1 >>> [u'\ud83d', u'\ude00', u'\ud83d', u'\ude00'] 我的愿望是: $ te = u'\U0001f600\U0001f600' $ flags1 = r

谁知道,当macthing将代码点拆分为代理项对时,是否可能禁止正则表达式

请参见以下示例:

现在情况如何:

$ te = u'\U0001f600\U0001f600'
$ flags1 = regex.findall(".", te, re.UNICODE)
$ flags1
>>> [u'\ud83d', u'\ude00', u'\ud83d', u'\ude00']
我的愿望是:

$ te = u'\U0001f600\U0001f600'
$ flags1 = regex.findall(".", te, re.UNICODE)
$ flags1
>>> [u'\U0001f600', u'\U0001f600']
为什么我真的需要它,因为我想在unicode字符串上迭代,每次迭代得到下一个unicode字符

见示例:

for char in  regex.findall(".", te, re.UNICODE):
   print char

Thx您预先=)

使用匹配代理项对或任何内容的正则表达式。这将在Python2的宽版本和窄版本中工作,但在宽版本中不需要,因为它不使用代理项对

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> te = u'A\u5200\U0001f600\U0001f601\u5100Z'
>>> print re.findall(ur'[\ud800-\udbff][\udc00-\udfff]|.', te, re.UNICODE)
[u'A', u'\u5200', u'\U0001f600', u'\U0001f601', u'\u5100', u'Z']
这在最新的Python 3中仍然有效,但也不需要,因为在Unicode字符串中不再使用代理项对(不再使用宽或窄构建):

win32上的Python 3.7.0(v3.7.0:1bf9cc5093,2018年6月27日,04:59:51)[MSC v.1914 64位(AMD64)] 有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。 >>>进口稀土 >>>te=u'A\u5200\U0001f600\U0001f601\u5100Z' >>>打印(关于findall(r'[\ud800-\udbff][\udc00-\udfff]|.,te))
[A','刀', 'Python的哪个版本?我怀疑它在Python 3.4上运行得很好。我刚刚在Python 3.6中进行了测试,是的,它运行得很好。同样,我看到了一个包含两个字符串的列表,每个字符串都相当于一个笑脸表情符号。不,我正在使用2.7cool,thx u=)看起来很好。Python 2.7是否有可能在常规模式中添加Graphimes支持,这是您在回答开始时给出的?-->r'[\ud800-\udbff][\udc00-\udfff]|不幸的是,您关于graphemes问题的示例不适用于python 2.7-(@Egor graphemes很复杂,需要了解最新的Unicode标准。2.7很旧,并且它的正则表达式库已经过时。