如何在Python 3.2正则表达式中指定西里尔字符范围?

时间:2012-06-11 13:40:02

标签: regex unicode python-3.x

曾几何时,我发现this question很有趣。

今天我决定玩那本书的文字。

我想在此脚本中使用正则表达式。当我在西里尔文本上使用脚本时,它会清除所有西里尔字符,只留下标点符号和空格。

#!/usr/bin/env python3.2
# coding=UTF-8

import sys, re

for file in sys.argv[1:]:
    f = open(file)
    fs = f.read()
    regexnl = re.compile('[^\s\w.,?!:;-]')
    rstuff = regexnl.sub('', f)
    f.close()
    print(rstuff)

this answer已经完成了类似的事情。

基本上,我只想指定一组不是字母,字母数字或标点符号或空格的字符。

3 个答案:

答案 0 :(得分:9)

这并不完全回答您的问题,但regex module比内置re模块具有更多 更多的unicode支持。例如regex支持\p{Cyrillic}属性及其否定\P{Cyrillic}(以及大量other unicode properties)。此外,它正确处理unicode不区分大小写。

答案 1 :(得分:9)

您可以非常轻松地指定unicode范围:\u0400-\u0500。另见here

以下是俄罗斯维基百科的一些文本示例,以及英文维基百科中包含西里尔字母单词的句子。

#coding=utf-8
import re

ru = u"Владивосток находится на одной широте с Сочи, однако имеет среднегодовую температуру почти на 10 градусов ниже."
en = u"Vladivostok (Russian: Владивосток; IPA: [vlədʲɪvɐˈstok] ( listen); Chinese: 海參崴; pinyin: Hǎishēnwǎi) is a city and the administrative center of Primorsky Krai, Russia"

cyril1 = re.findall(u"[\u0400-\u0500]+", en)
cyril2 = re.findall(u"[\u0400-\u0500]+", ru)

for x in cyril1:
    print x

for x in cyril2:
    print x

输出:

Владивосток
------
Владивосток
находится
на
одной
широте
с
Сочи
однако
имеет
среднегодовую
температуру
почти
на
градусов
ниже

增加:

另外两种方式也应该有效,并且比指定unicode范围更不像是hackish:

  • re.findall("(?u)\w+", text)应与西里尔字母和拉丁字符匹配。
  • re.findall("\w+", text, re.UNICODE)相当于

所以,更具体地针对您的问题: * re.compile('[^\s\w.,?!:;-], re.UNICODE')应该可以解决问题。

here(第7点)

答案 2 :(得分:-2)

出于实际原因,我建议使用精确的现代俄语字形子集,而不是一般的西里尔字母。这是因为俄罗斯网站从未使用完整的西里尔语子集,其中包括白俄罗斯语,乌克兰语,斯拉夫语和马其顿语字形。由于历史原因,我保留“你\ 0463”。

//用于俄罗斯网站的基本Cyr Unicode范围。 0401,0406,0410,0411,0412,0413,0414,0415,0416,0417,0418,0419,041A,041B,041C,041D,041E,041F,0420,0421,0422,0423,0424,0425,0426, 0427,0428,0429,042A,042B,042C,042D,042E,042F,0430,0431,0432,0433,0434,0435,0436,0437,0438,0439,043A,043B,043C,043D,043E,043F, 0440,0441,0442,0443,0444,0445,0446,0447,0448,0449,044A,044B,044C,044D,044E,044F,0451,0462,0463

与使用原始全音域相比,在多语言网站上使用此子集可为您节省60%的带宽,并相应地提高页面加载速度。