Удалить весь текст перед буквой или цифрой

#python #regex

#python #регулярное выражение

Вопрос:

Я должен удалить весь текст перед любой буквой или цифрой, используя python.

Строка, с которой мне приходится иметь дело, может быть:

- Presa di coscienza

-3D is better than 2D

Basi di ottica

И результат должен быть:

Presa di coscienza

3D is Better than 2D

Basi di ottica

Поиск в Интернете, я создал это регулярное выражение:

^.*?([A-Z]|[0-9])

Это работает хорошо, но при этом также удаляется первая буква. Как я могу это сделать?

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

1. Возможно, вы захотите удалить ? , что означает «один из любых символов» перед вашей группой захвата. Кроме того, вы можете включить строчные буквы в свою группу захвата.

2.Вы могли бы использовать позитивный прогноз с отрицаемым символьным классом ^[^A-Z0-9rn]*(?=[A-Z0-9]) regex101.com/r/RFeq0G/1

Ответ №1:

Позитивный взгляд — это ваш ответ:

 ^.*?(?=[A-Z]|[0-9])
  

Лишнее ?= имеет решающее значение:

Положительный прогноз будет в значительной степени соответствовать любой [A-Z]|[0-9] группе, найденной после основного выражения (например ^.*? ), фактически не включая ее в результат.

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

1. [A-Z]|[0-9] лучше написано [A-Z0-9] и удобнее сопоставлять также строчные буквы [A-Za-z0-9]

2. @Toto : Окончательно верно. [0-z] также является более лаконичной альтернативой . Я просто имитировал оригинальное решение OP. Может быть, он хочет сопоставлять только заглавные буквы?

3. Обратите внимание, что [0-z] совпадения в таблице ASCII от 48 до 122 десятичных значений, что больше, чем [A-Za-z0-9]

Ответ №2:

Шаблон, который вы попробовали, удаляет первую букву, поскольку она сначала соответствует 0 или более раз любому символу с использованием не жадного квантора, а затем фиксирует либо символ верхнего регистра AZ, либо цифру 0-9.

Этот захват является частью соответствия и также будет удален.

Вместо этого вы можете использовать позитивный прогноз (?=[A-Z0-9]) , утверждающий, что то, что находится непосредственно справа, является либо заглавным символом от А доЯ, либо цифрой, использующей класс single character.

Вместо использования non greedy .*? вы можете использовать класс отрицаемых символов, соответствующий 0 любому символу, кроме новой строки или заглавных букв A-Z или цифры, и предотвратить ненужный возврат назад.

 ^[^A-Z0-9rn]*(?=[A-Z0-9])
  

Объяснение

  • ^ Начало строки
  • [^A-Z0-9rn]* Отрицаемый класс символов, соответствует 0 раз любому символу, кроме того, что указан в списке
  • (?=[A-Z0-9]) Позитивный взгляд, утверждайте, что то, что находится непосредственно справа, является символом AZ или цифрой 0-9

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