PYTHON RE 不要在匹配时将 UNICODE 字符拆分为代理项对
PYTHON RE Dont split UNICODE Chars into surrogate pairs while matching
谁知道,如果可以在将代码点拆分为代理对时禁止正则表达式。
参见以下示例:
现在怎么样:
$ 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
提前谢谢你=)
使用匹配代理项对或任何内容的正则表达式。这将适用于 Python 2 的宽和窄构建,但在宽构建中不需要,因为它不使用代理对。
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 字符串中不再使用代理项对(不再使用宽或窄构建):
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> te = u'A\u5200\U0001f600\U0001f601\u5100Z'
>>> print(re.findall(r'[\ud800-\udbff][\udc00-\udfff]|.', te))
['A', '刀', '', '', '儀', 'Z']
没有代理匹配的作品:
>>> print(re.findall(r'.', te))
['A', '刀', '', '', '儀', 'Z']
然后你就可以在 Python 中正常迭代 3:
>>> for c in te:
... print(c)
...
A
刀
儀
Z
请注意,字形(表示单个字符的 Unicode 代码点组合。这是一个糟糕的例子:
>>> s = ''
>>> for c in s:
... print(c)
...
regex
第3方模块可以匹配字素:
>>> import regex
>>> s = ''
>>> for c in regex.findall('\X',s):
... print(c)
...
谁知道,如果可以在将代码点拆分为代理对时禁止正则表达式。
参见以下示例:
现在怎么样:
$ 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
提前谢谢你=)
使用匹配代理项对或任何内容的正则表达式。这将适用于 Python 2 的宽和窄构建,但在宽构建中不需要,因为它不使用代理对。
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 字符串中不再使用代理项对(不再使用宽或窄构建):
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> te = u'A\u5200\U0001f600\U0001f601\u5100Z'
>>> print(re.findall(r'[\ud800-\udbff][\udc00-\udfff]|.', te))
['A', '刀', '', '', '儀', 'Z']
没有代理匹配的作品:
>>> print(re.findall(r'.', te))
['A', '刀', '', '', '儀', 'Z']
然后你就可以在 Python 中正常迭代 3:
>>> for c in te:
... print(c)
...
A
刀
儀
Z
请注意,字形(表示单个字符的 Unicode 代码点组合。这是一个糟糕的例子:
>>> s = ''
>>> for c in s:
... print(c)
...
regex
第3方模块可以匹配字素:
>>> import regex
>>> s = ''
>>> for c in regex.findall('\X',s):
... print(c)
...