正则表达式无效

时间:2014-11-24 12:35:40

标签: python regex unicode

我需要删除{} &+( )" =!.?.:.. / | » © : >< # « ,] _ - + ; [ ]等所有符号,包括文件中的数字。

import codecs
import re
def clean_symbol() :
    symbols = re.compile(r'[{} &+( )" =!.?.:.. / |  » © : >< #  «  ,]  _ - + ; [ ]  % 1, 2,3',flags=re.UNICODE)
    with codecs.open("e.txt","r") as fileobject:
        for line in fileobject:           

            good_words = symbols.sub(" ",line)

            print(good_words)
            with codecs.open("/home/corpus/Clean_tex1t.txt",'a',encoding="utf-8") as out:
                out.write(good_words)

这是从Unicode文本文件中删除符号但代码产生预期结果的代码。 输入

 «   » 


    _                       _468 60_1");


                 _     "         :1004    :1000;                   ;"
                :1004      :0     ;"
                  "              :0099  ;"
              _   2"         :68          :14                3300    (   12         _   .   )        68   -137  ;"             "           :4   20   5   12  ;"        .   "        
            "
 സര്‍ക്കാര്‍ജീവനക്കാരുടെ ശമ്പളം അറിയാന്‍ ഭാര്യമാര്‍ക്ക് അവകാശമുണ്ട്വിവരാവകാശകമ്മീഷന്‍  

                "       ="_     "             :8  ;"                 
                "       ="_     "               


          "       ="_     "     

预期输出

സര്‍ക്കാര്‍ജീവനക്കാരുടെ ശമ്പളം അറിയാന്‍ ഭാര്യമാര്‍ക്ക് അവകാശമുണ്ട്വിവരാവകാശകമ്മീഷന്‍    

代码根本不起作用。这有什么问题?

3 个答案:

答案 0 :(得分:1)

正则表达式可能不是处理问题的最佳方法,除非您真的只想过滤掉指定的特殊字符。 略有不同的方法,可能并不精彩,但会返回预期的结果:

# coding=utf-8

text = u"<yourcontenthere>"

res = ""
for i in text:
    if ord(i)>255:
        res = res + i
print res

这适用于您的示例。 (我已对它进行了测试。)它会过滤掉所有ASCII字符,并为您留下您期望的结果。

答案 1 :(得分:1)

我推荐使用regex模块进行严肃的unicode工作。此外,匹配要保留的符号(=白名单)通常比删除不需要的字符(=黑名单)更容易。例如:

import regex
print ' '.join(regex.findall(ur'[\p{IsMalayalam}\u200D]+', data))

打印您要查找的内容。 [\p{IsMalayalam}\u200D]匹配马拉雅拉姆语字符或ZWJ符号。

答案 2 :(得分:0)

字符类中的语法非常有限,并且具有插入符号的特殊情况(如果它是字符类中的第一个字符则表示否定),短划线(如果它不是第一个或最后一个字符,则表示范围在字符类中)和关闭方括号(表示字符类的结尾,除非它是可选插入符后面的第一个字符,也许是破折号)。通常,打开方括号列在关闭方括号旁边,以保持配对。

所以你的正则表达式必须重构为

r'[-][{} &+( )" =!?:./|»©:><#«,_\-+;]'

排除重复项并假设加号​​之前的字符不是常规ASCII短划线而是某些Unicode字符。 (也许使用十六进制转义来消除歧义。我发现我必须反斜杠。)

如果您想添加数字,那应该很容易。你似乎也缺少单引号;这是故意的吗?