В Python как удалить переменное количество вхождений шаблона RegEx из конца строки?

Вопрос или проблема

В 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'

Объяснение кода:

  1. Импорт библиотеки re: Эта библиотека предназначена для работы с регулярными выражениями в Python.

  2. Определение регулярного выражения:

    • r"( ?[A-Z][a-z]+ [A-Z][a-z]+)+$":
      • ? — допускает пробел перед именем.
      • [A-Z][a-z]+ — соответствует первой части имени (первая буква заглавная, остальные — строчные).
      • + — соответствует пробелу между двумя частями имени.
      • [A-Z][a-z]+ — соответствует второй части имени, аналогично первой.
      • +$ — указывает, что данное выражение должно находиться в конце строки.
  3. Функция strip_proper_names:
    • Использует метод sub из библиотеки re, чтобы заменить все найденные вхождения "Proper Names" на пустую строку.
    • rstrip() — удаляет любые пробелы в конце полученной строки.

Этот подход будет корректно работать, если строки заканчиваются на "Proper Names". Однако если строка заканчивается на цифры или не содержит "Proper Names", функция не будет производить никаких изменений, и исходная строка останется неизмененной.

Оцените материал
Добавить комментарий

Капча загружается...