曾几何时,我发现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已经完成了类似的事情。
基本上,我只想指定一组不是字母,字母数字或标点符号或空格的字符。
答案 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%的带宽,并相应地提高页面加载速度。