【问题标题】:Python splitting a string with accented lettersPython用重音字母分割字符串
【发布时间】:2018-12-20 00:37:51
【问题描述】:

我想将包含重音字符的字符串拆分为字符,而不会将重音字符和字母分开。

一个简单的例子是

>>> o = u"šnjiwgetit"
>>> print u" ".join(o)
s ̌ n j i w g e t i t

>>> print list(o)
[u's', u'\u030c', u'n', u'j', u'i', u'w', u'g', u'e', u't', u'i', u't']

而我希望结果为š n j i w g e t i t,以便重音保持在辅音之上。

该解决方案应该适用于更难的字符,例如h̭ɛ̮ŋkkɐᴅ

【问题讨论】:

  • ' '.join(unicodedata.normalize('NKFC', o)) 做你想做的事吗?认为这是使用正确的模式,因为 s 可能需要组合以使其成为单个字符。
  • ' '.join(unicodedata.normalize('NKFC', o)) 给出 ValueError: invalid normalization form
  • 糟糕... NFKC...
  • 谢谢,这似乎适用于大多数情况。虽然,我真的很感激有一个解决方案,即使在 h̭ɛ̮ŋkkɐᴅ 等更困难的情况下也能工作。使用 unicodedata.normalize 它仍然输出为 h ̭ ɛ ̮ ŋ k k ɐ ᴅ
  • 直到有人非常精通 Unicode 的细微差别出现之前——我可能会阅读一点 Python Unicode HOWTO 以及 unicodedata.normalize 的所有这些模式的作用...

标签: python-2.7 unicode diacritics non-ascii-characters python-unicode


【解决方案1】:

您可以使用正则表达式对字符进行分组。这是一个示例代码:

import re
pattern = re.compile(r'(\w[\u02F3\u1D53\u0300\u2013\u032E\u208D\u203F\u0311\u0323\u035E\u031C\u02FC\u030C\u02F9\u0328\u032D:\u02F4\u032F\u0330\u035C\u0302\u0327\u03572\u0308\u0351\u0304\u02F2\u0352\u0355\u00B7\u032C\u030B\u2019\u0339\u00B4\u0301\u02F1\u0303\u0306\u030A7\u0325\u0307\u0354`\u02F0]+|\w|\W)', re.UNICODE | re.IGNORECASE)

如果您缺少某些重音符号,请将它们添加到模式中。

然后,您可以将单词拆分为字符,如下所示。

print(list(pattern.findall('šnjiwgetit')))
['š', 'n', 'j', 'i', 'w', 'g', 'e', 't', 'i', 't'
print(list(pattern.findall('h̭ɛ̮ŋkkɐᴅ')))
['h̭', 'ɛ̮', 'ŋ', 'k', 'k', 'ɐ', 'ᴅ']

如果您使用的是 Python2,请在文件开头添加from __future__ import unicode_literals

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 2016-05-15
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2021-06-12
    • 2022-06-23
    相关资源
    最近更新 更多