#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]
, что означает не слово, цифру .?!
или пробелы.