Вопрос или проблема
В Python как удалить переменное количество вхождений шаблона RegEx из конца строки?
Для этого вопроса предположим, что правильное имя соответствует этому
[A-Z][a-z]+ [A-Z][a-z]+
Предположим, у меня есть строка, которая может заканчиваться так
некоторый текст Какое-то Имя
и в этом случае мы хотели бы удалить правильное имя.
Или она может заканчиваться так
некоторый текст Другая ВариацияИмени
и это также подходит, поэтому мы убираем это правильное имя.
Или она может заканчиваться так
некоторый текст Какое-то Имя Другая ВариацияИмени
и мы хотели бы удалить оба имени.
Или она может заканчиваться цифрами, и тогда мы не хотим ничего делать.
Как отрезать из строки переменное количество вхождений правильного имени в конце?
Если вы измените свое регулярное выражение так, чтобы вместо того, чтобы соответствовать одному правильному имени, оно соответствовало одному или нескольким правильным именам в конце строки, как это:
re_proper_name = re.compile(r"( ?[A-Z][a-z]+ [A-Z][a-z]+)+$")
Тогда вы можете просто удалить часть строки, которая соответствует:
def strip_proper_names(text: str) -> str:
if mo := re_proper_name.search(text):
start, end = mo.span()
text = (text[:start] + text[end:])
return text
Пример использования:
>>> strip_proper_names('некоторый текст Какое-то Имя')
'некоторый текст'
>>> strip_proper_names('некоторый текст Какое-то Имя Другая ВариацияИмени')
'некоторый текст'
@Barmar предпочитает использовать re.sub()
. Если бы вы сделали это, это выглядело бы так:
def strip_proper_names(text: str) -> str:
return re_proper_name.sub("", text)
Ответ или решение
Для удаления переменного числа вхождений шаблона регулярного выражения (RegEx) "Proper Name" в конце строки в Python, необходимо создать регулярное выражение, которое будет соответствовать одному или нескольким "Proper Names" на завершении строки. Шаблон для такого выражения может выглядеть следующим образом:
import re
# Определяем регулярное выражение для Proper Names.
re_proper_name = re.compile(r"( ?[A-Z][a-z]+ [A-Z][a-z]+)+$")
def strip_proper_names(text: str) -> str:
"""Удаляет 'Proper Names' с конца строки."""
return re_proper_name.sub("", text).rstrip() # Удаление лишних пробелов в конце
# Примеры использования функции
print(strip_proper_names('sometext Some Name')) # Вывод: 'sometext'
print(strip_proper_names('sometext Some Name Another Namevariation')) # Вывод: 'sometext'
print(strip_proper_names('sometext 12345')) # Вывод: 'sometext 12345'
Объяснение кода:
-
Импорт библиотеки
re
: Эта библиотека предназначена для работы с регулярными выражениями в Python. -
Определение регулярного выражения:
r"( ?[A-Z][a-z]+ [A-Z][a-z]+)+$"
:?
— допускает пробел перед именем.[A-Z][a-z]+
— соответствует первой части имени (первая буква заглавная, остальные — строчные).+
— соответствует пробелу между двумя частями имени.[A-Z][a-z]+
— соответствует второй части имени, аналогично первой.+$
— указывает, что данное выражение должно находиться в конце строки.
- Функция
strip_proper_names
:- Использует метод
sub
из библиотекиre
, чтобы заменить все найденные вхождения "Proper Names" на пустую строку. rstrip()
— удаляет любые пробелы в конце полученной строки.
- Использует метод
Этот подход будет корректно работать, если строки заканчиваются на "Proper Names". Однако если строка заканчивается на цифры или не содержит "Proper Names", функция не будет производить никаких изменений, и исходная строка останется неизмененной.