#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