正则表达式匹配来自多种语言的表情符号或单词字符等图形字符

时间:2014-11-20 07:00:09

标签: python regex twitter locale

我发布了一系列来自多种语言的推文,其中包含大量的表情符号和其他图形unicode代码点。我希望能够对这些文本进行标记,以便图形字符是单独的标记(为此,我可以将它们用空格包围,然后在空格上分割)。

以下是使用以下字形的潜在推文文本示例:

恐惧中的面部表格:(U + 1F631)

KISS MARK:(U + 1F48B)

# glyph_re is the regular expression I'm looking for
tw = u"piñata\U0001f631 \U0001f48bčíslo"
tw_spaced = re.sub(u'('+glyph_re+u')',ur' \1 ',tw)
tw_tokens = re.split(ur'\s',tw_spaced)
desired output = [u"piñata",u"\U0001f631",u"\U0001f48b",u"číslo"]

我希望glyph_re能够捕获任何不是空格或在某种语言的脚本中使用的字符。在此示例中,piñata为西班牙语,číslo为捷克语。我尝试使用ur"[^\w\s]"并将flags=re.U添加到subsplit调用,但似乎字形被视为字符,至少在Ubuntu和OSX中(其中)语言,我想知道!)。

1 个答案:

答案 0 :(得分:0)

基本的问题是默认的re包(无论如何在python 2.7中)都不能很好地处理unicode。然而,有一个改进的正则表达式package on pypi called regex可以做得更好。

正则表达式包自述文件说明:

  

'LOCALE标志用于遗留代码,并且支持有限。你仍然建议使用Unicode。'

使用regex包,您可以使用\p{...}和否定的\P{...}结构来引用unicode属性。因此,要从任何语言中查找“字母”字符串,您可以使用:

reWords = '\p{Letter}+'

官方unicode网站列出了一些有用的general character properties

为了实现我在问题中提到的标记化,我做了这个:

import regex as re

def tokenize(s):
    words,glyphs = [],[]
    for part in re.split(ur'\P{Letter}+',s):
        if part:
            words.append(part)
    for part in re.split(ur'(\p{Letter}|\p{Separator})+',s)[0::2]:
        glyphs.extend(unicodeCharIterator(part))
    return words,glyphs

s=ur"piñata\U0001f631 \U0001f48bčíslo"
words,glyphs = tokenize(s)

这是单词/字形丢失的顺序,但对我来说并不重要。

我使用了General_Category个值,但还有其他字符属性,如Script(如果它是一个空字符串,它不属于任何语言的脚本)和{{1} (可以使用的二元propoerty)。维基百科有一个page on unicode character properties