使用正则表达式从字符串中提取Unicode字符

1 投票
2 回答
3347 浏览
提问于 2025-04-18 06:25

我想从一个字符串中提取Unicode字符,也就是只保留一些特定的文字,比如印地语或中文,同时去掉ASCII字符、数字和特殊符号。我想知道用正则表达式能不能做到这一点。比如,我只想从新闻文章中提取出印地语或中文的字符。

2 个回答

2

使用这个第三方的正则表达式模块,你可以通过unicode脚本来表达你的匹配模式:

import regex
print(repr(regex.sub(ur'[^\p{Devanagari}\p{Han}]', u'', u'abc123\u0900'))) 
# u'\u0900'
4

如上所述,ASCII是Unicode的一部分,所以这个问题本身有点不太对劲。如果你真的想从字符串中去掉所有小于U+0080的字符,那是很简单的:

re.sub(r"[\x00-\x7f]+", "", mystring)

如果你只想保留某些“白名单”中的字符,你需要明确指定要保留哪些字符。

比如,如果你想保留用于书写印地语的天城文字符,可以使用:

re.sub(r"[^\u0900-\u097F]+", "", mystring)

或者(对于Python 2,感谢@bobince的提醒!)

re.sub(ur"[^\u0900-\u097F]+", "", mystring)

你需要确保你处理的是Unicode字符串,所以不要忘了对输入字符串进行解码和编码:

url = 'http://www.bhaskar.com/'
data = urllib2.urlopen(url).read().decode("utf-8-sig")
regex = re.compile(ur"[^\u0900-\u097F]+")
hindionly = regex.sub("foo", data)
print hindionly.encode("utf-8")

撰写回答