Задать вопрос
@WHATsMyName

Как исправить ошибку с регулярными выражениями?

import re

text = ["Any reason for the pump"] # 5
text = re.sub('–—!"#$%&()*,-./:;<=>@[\\]^_`{|}~\t\n\xa0–\ufeff', '', str(text))
print(text)

Возникает следующая ошибка: re.error: unterminated character set at position 21 (line 1, column 22)

Так же важно понять, почему ошибка здесь:

import re

text = ["Any reason for the pump"] # 5

text = re.sub('–—!"#$%&()*+,-./:;<=>@[\\]^_`{|}~\t\n\xa0–\ufeff', '', str(text))
print(text)


Возникает следующая ошибка: re.error: multiple repeat at position 11 (line 1, column 12)

Разница между ними лишь в том, что во втором re есть +, я его убрал, однако не понимаю, почему выдает ошибку и как сделать так, чтобы + так же был в re. Однако ошибка первого примера приоритетнее
  • Вопрос задан
  • 469 просмотров
Подписаться 1 Средний 3 комментария
Решения вопроса 2
@o5a
Если пытались исключить все символы из набора, то надо было их заключить в квадратные скобки.
text = re.sub('[–—!"#$%&()*,-./:;<=>@[\\]^_`{|}~\t\n\xa0–\ufeff]', '', str(text))

А в изначальном виде у вас написан не набор символов, а последовательный шаблон поиска.
Лучше почитайте хотя бы основы регулярных выражений, поймете ошибку.
Но помимо этого Вы что-то странное делаете: из списка формируете строку зачем-то str(text) и из нее удаляете символы. Вы не умеет работать со списками? Для чего это было нужно?
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Ну так почитай основы.
Во-первых, используй r-строки, чтобы не натыкаться на проблемы с символом \.
Во-вторых, изучи зарезервированные символы регулярных выражений, а именно: ( ) [ ] ^ $ . ? * +. Если тебе нужен этот символ как просто символ, его надо экранировать! Т.е. если тебе нужно совпадение с символом ?, надо писать \?.
В-третьих, для поиска символа из указанного набора используются квадратные скобки, т.е. [abc] совпадёт с одним символом из указанных: a, b или c. Для задания диапазона можно сделать так: [a-z]. Это зачастую короче.
В-четвёртых, для поиска символа НЕ из указанного набора используется такой синтаксис: [^abc]
В-пятых, есть заранее заданные наборы. Например, \w описывает словесные символы (буквы, цифры и подчёркивание), \d описывает цифры, и т.д. Аналогично, \W и \D описывают всё кроме словесных символов и цифр, соотв.
Тогда у тебя будет два варианта
Если подчёркивание - не проблема:
re.sub(r'\W', '', 'test:_:test', re.I)  # даст test_test

Если подчёркивание тоже нужно убрать:
re.sub(r'[\W_]', '', 'test:_:test', re.I)  # даст testtest
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы