首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Python3.2regex中指定西里尔字符范围?

如何在Python3.2regex中指定西里尔字符范围?
EN

Stack Overflow用户
提问于 2012-06-11 21:40:02
回答 3查看 7.1K关注 0票数 8

很久以前,我发现this question很有趣。

今天我决定把那本书的内容翻来翻去。

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

代码语言:javascript
运行
复制
#!/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中已经做了一些非常类似的事情。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-11 22:07:19

这并没有确切地回答您的问题,但是与内置的re模块相比,regex module对unicode的支持要好得多。例如,regex支持\p{Cyrillic}属性及其否定\P{Cyrillic} (以及大量的other unicode properties)。此外,它可以正确处理unicode不区分大小写。

票数 11
EN

Stack Overflow用户

发布于 2012-06-11 22:41:11

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

这是一个来自俄语维基百科的例子,还有一个来自英语维基百科的句子,其中包含一个西里尔语单词。

代码语言:javascript
运行
复制
#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

输出:

代码语言:javascript
运行
复制
Владивосток
------
Владивосток
находится
на
одной
широте
с
Сочи
однако
имеет
среднегодовую
температуру
почти
на
градусов
ниже

添加:

另外两种方式也应该起作用,而且比指定unicode范围要少一点老套的方式:

  • re.findall("(?u)\w+", text)应该与西里尔文和拉丁单词characters.
  • re.findall("\w+", text, re.UNICODE)等同于

因此,更具体地针对您的问题:* re.compile('[^\s\w.,?!:;-], re.UNICODE')应该可以做到这一点。

请参阅here (第7点)

票数 10
EN

Stack Overflow用户

发布于 2014-11-15 20:21:06

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10981258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档