8

曾几何时,我发现这个问题很有趣。

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

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

#!/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)

在这个答案中已经做了一些非常相似的事情。

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

4

3 回答 3

11

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

于 2012-06-11T14:07:19.187 回答
10

您可以很容易地指定 unicode 范围:\u0400-\u0500. 另请参见此处

这是一个来自俄罗斯维基百科的文本示例,以及来自英语维基百科的一个句子,其中包含一个西里尔字母单词。

#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 范围要少一些骇人听闻的方式:

  • re.findall("(?u)\w+", text)应该匹配西里尔字母和拉丁字母字符。
  • re.findall("\w+", text, re.UNICODE)是等价的

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

这里(第 7 点)

于 2012-06-11T14:41:11.207 回答
-2

出于实际原因,我建议使用确切的现代俄语字形子集,而不是一般的西里尔字母。这是因为俄罗斯网站从不使用完整的西里尔字母子集,其中包括白俄罗斯语、乌克兰语、斯拉夫语和马其顿语字形。由于历史原因,我保留“u\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% 的带宽,并相应地提高页面加载速度。

于 2014-11-15T12:21:05.693 回答