Python: код регулярных выражений не может удалить ‘ и — из текста

#python #regex #punctuation

#python #регулярное выражение #пунктуация

Вопрос:

У меня есть фрагмент текста, образец которого я включил ниже.

 'tis too true! How smart a lash that 
speech doth give my conscience! The harlot's cheek beautied with plastering art Is not more ugly to the thing
 

Я хочу избавиться от всех знаков препинания, которые не являются «.?!». И я думал, что сделал это, используя приведенный ниже код:

 hamsplits2 = re.sub(r'[^[a-z.?!s]]', "", hamsplits1) # substitute any character that is not what's in box
 

Но код, похоже, не работает, потому что, когда я печатаю (hamsplits2) Я все еще получаю апострофы и тире.

 how smart a lash that 
speech doth give my conscience! the harlot's cheek beautied with plastering art is not more ugly to the
 

Что не так с моим регулярным выражением, из-за чего оно не удаляет апострофы и тире?

Ответ №1:

Ваше [^[a-z.?!s]] регулярное выражение является «искаженным» шаблоном. Он содержит две части [^[a-z.?!s] и ] атомы. [^[a-z.?!s] это класс отрицаемых символов, который соответствует любому символу, кроме [ строчной буквы, . , ? , ! и пробела, и ] соответствует литералу ] . Итак, он соответствует комбинациям из двух символов, таким как ]] , 1] , и т.д.

Вы можете использовать

 hamsplits2 = re.sub(r'[^ws.?!]|_', '', hamsplits1)
 

Смотрите демонстрацию регулярных выражений

Регулярное [^ws.?!]|_ выражение соответствует либо символу пунктуации, отличному от . , ? и ! и _ , либо _ (это потому w , что соответствует подчеркиванию, а не только буквам и цифрам).

Подробнее

  • [^ws.?!] — отрицаемый символьный класс, соответствующий любому символу, отличному от слова char ( w ), символа пробела s . (), ? и !
  • | — или
  • _ — символ подчеркивания.

Комментарии:

1. спасибо за подробное объяснение. можете ли вы пояснить, почему моя первоначальная попытка не сработала?

2. @PineNuts0 Я добавил объяснение в качестве первого абзаца.

3. Я понимаю… но почему мое исходное регулярное выражение не соответствует — и ‘ ?

4. @PineNuts0 Он соответствует комбинациям из двух символов. Посмотрите демонстрацию регулярных выражений.

Ответ №2:

Вам нужно экранировать первый ] , чтобы он обрабатывался как буквальный символ, а не завершал первый [ .

 hamsplits2 = re.sub(r'[^[a-z.?!s]]', "", hamsplits1)
 

Если вы не хотели включать [ и ] в набор знаков препинания, который следует сохранить, удалите их оба из набора символов:

 hamsplits2 = re.sub(r'[^a-z.?!s]', "", hamsplits1)
 

Ответ №3:

вы можете попробовать это регулярное выражение: [^wd.?!s] , что означает не слово, цифру .?! или пробелы.