2014-11-24 3 views
0

Мне нужно удалить все символы, такие как {} &+()" =!.?.:../| » © : >< # « ,] _ - + ; [ ], включая цифры из файла.Регулярное выражение не работает

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, но код производит ожидаемые результаты. Input

« » 


    _      _468 60_1"); 


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

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


      "  ="_  "  

Ожидаемый результат

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

код не работает вообще. В чем проблема?

+0

Это не последняя строка. Он смешивается с символами. –

+1

. Ваше регулярное выражение в основном ищет литеральную строку '_ - +; % 1, 2,3', с префиксом еще одного знака. Я не думаю, что это то, чего вы хотели достичь. Можете ли вы уточнить, что должно и не должно делать регулярное выражение? – Boldewyn

+0

@PeterWood Нет, проблема отличается здесь, пожалуйста, проверьте код –

ответ

0

Синтаксис внутри символьного класса очень ограничен и имеет специальные случаи для каретки (что означает отрицание, если это первый символ в классе символов), тире (что означает диапазон, если он не первый или последний символ в классе символов) и закрытие квадратной скобки (что означает конец символьного класса, если только это не первый символ после необязательной каретки и, возможно, тире). Обычно открывать квадратный кронштейн указан рядом с закрывающей квадратной скобкой, чтобы держать их в паре.

Так что ваше регулярное выражение должно быть переработано в

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

за исключением дубликатов и приобретает характер до плюс не обычный ASCII тир, а какой-то символ Unicode. (Возможно, использовать гексагональные экраны для устранения неоднозначности. Я обнаружил, что мне пришлось обратный слэш.)

Если вы хотите добавить номера, это должно быть легко. Кажется, что вам не хватает одной кавычки; это намеренно?

+0

Traceback (самый последний вызов последним): Файл "", строка 1, в clean_symbol() Файл «/ главная/akallararajappan/корпус/clean_symbol .py ", строка 4, в clean_symbol символы = re.compile (r '[-] [{} & +()" =!?: ./ | »©:><#«, _- +; -] ') Файл "/usr/lib/python3.2/re.py ", строка 206, в компиляции return _compile (pattern, flags) Файл" /usr/lib/python3.2/re.py ", строка 255, в _compile return _compile_typed (тип (шаблон), шаблон, флаги) Файл «/usr/lib/python3.2/functools.py», строка 184, в обертке result = user_function (* args, ** kwds) Он дает много erros –

+0

Редактирование знака минус - который я прокомментировал - позволяет моему Python скомпилировать его. Я не получаю ту же ошибку, о которой вы сообщаете. Обратный знак минус также работает. – tripleee

+0

Я получаю то же самое в двух версиях python –

1

Возможно, Regex не лучший подход для решения вашей проблемы, если только вы хотите только отфильтровать указанные специальные символы. Немного другой подход, возможно, не блестящий, но возвращает ожидаемый результат:

# coding=utf-8 

text = u"<yourcontenthere>" 

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

Это работает для вашего примера. (Я протестировал его.) Он отфильтровывает все символы ASCII и оставляет вас с ожидаемым результатом.

1

Я рекомендую модуль regex для серьезной работы в Юникоде. Кроме того, совпадающие символы, которые вы хотите сохранить (= белый список), обычно проще, чем удаление нежелательных символов (= черный список). Пример:

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

Это печатает то, что вы ищете. [\p{IsMalayalam}\u200D] соответствует символу малаялама или символу ZWJ.

Смежные вопросы