Регулярное выражение Python для замены любых символов, которые не являются ни буквами, ни пробелами - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь заменить все не буквы и не пробелы на ''. Я думал, что приведенный ниже код работает нормально в ряде тестовых случаев, однако он не работает, если речь идет о специальных, экранированных символах.

import re
def process_text(text):
  text = text.lower()
  text = re.sub(pattern='[^A-z ^\s]',repl='',string=text).split(' ')
  return [word for word in text if word != '']

process_text('abc 123')
>>>> ['abc'] # this is what I wanted.

process_text('abc 123 \n')
>>>> ['abc', '\n'] # I don't want the new line character.

Приведенная ниже ссылка информировала меня о том, что \ s - это любой пробел. https://www.debuggex.com/cheatsheet/regex/python

Однако в официальной документации говорится, что \ s эквивалентно «Соответствует любому символу пробела; это эквивалентно [\ t \ n \ r \ f \ v]». https://docs.python.org/3/howto/regex.html

Итак, теперь я вижу, что в моем коде написано ~ найдите что-нибудь, что не является буквой и отсутствует в указанном выше наборе специальных символов, и замените его на ''.

Так же естьспособ сохранить пробел, но удалить другие специальные символы?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Итак, в вашем шаблоне есть следующие вещи, которые неправильны, давайте сначала обратимся к ним

[^A-z ^\s]
  • A-z - Он включает в себя все символы из таблицы ascii, начиная с A до z, чтотакже есть не алфавитные символы, которые мы не хотим сопоставлять, поэтому правильный должен быть [A-Z], если мы хотим использовать только верхний регистр, если мы хотим использовать как верхний, так и нижний регистр, то это должно быть [A-Za-z], или вы можете включить i flag
  • ^\s - ^ означает отрицание только тогда, когда вы используете его в качестве первого символа внутри класса символов, в другом месте оно рассматривается как литерал ^

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

 [^A-Za-z\s]
1 голос
/ 23 октября 2019

Чтобы сопоставить все несловесные и непробельные символы, вы можете использовать [^\w\s] - \w - любую букву, цифру или подчеркивание, а \s - пробел. Если вы предпочитаете получать только буквы, вы можете использовать [^a-zA-Z\s].

(Кроме того, когда вы отрицаете группу захвата, вам нужно только поставить ^ в самом начале.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...