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

mag*_*tar 8 regex unicode python-3.x

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

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

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

#!/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)
Run Code Online (Sandbox Code Playgroud)

这个答案中已经完成了一些非常相似的事情.

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

huo*_*uon 9

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


Jun*_*uxx 9

您可以非常轻松地指定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
Run Code Online (Sandbox Code Playgroud)

输出:

???????????
------
???????????
?????????
??
?????
??????
?
????
??????
?????
?????????????
???????????
?????
??
????????
????
Run Code Online (Sandbox Code Playgroud)

加成:

另外两种方法也应该起作用,并且比指定unicode范围稍微不那么强烈:

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

所以,更具体地针对你的问题:*re.compile('[^\s\w.,?!:;-], re.UNICODE')应该做的伎俩.

这里(第7点)