Python - Использование регулярного выражения для написания функции, имитирующей метод strip () - PullRequest
2 голосов
/ 07 мая 2020

Я делаю задачу из Automate the Boring Stuff, пытаясь имитировать метод strip () с использованием регулярного выражения. Я в значительной степени разобрался, работает с пробелами и определенным словом c, которое я хочу удалить. Но при удалении определенного ключевого слова c из конца строки оно всегда обрезает последнюю букву строки, может ли кто-нибудь помочь мне выяснить, почему?

def strip_func(string, *args):
strip_regex = re.compile(r'^(\s+)(.*?)(\s+)$')
mo = strip_regex.findall(string)
if not mo:
    rem = args[0]
    remove_regex = re.compile(rf'({rem})+(.*)[^{rem}]')
    remove_mo = remove_regex.findall(string)
    print(remove_mo[0][1])

else:
    print(mo[0][1])

Итак, если второй аргумент не передано, то функция удаляет пробелы с обеих сторон строки, я использовал эту строку, чтобы проверить это:

s = '        This is a string with whitespace on either side        '

В противном случае она удаляет ключевое слово, что-то вроде функции полосы. Например:

spam = 'SpamSpamBaconSpamEggsSpamSpam'
strip_func(spam, 'Spam')

Вывод:

BaconSpamEgg

Таким образом, если в конце Eggs отсутствует буква «s», то же самое происходит с каждой строкой, которую я пробую. Заранее благодарим за помощь.

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете использовать

import re

def strip_func(string, *args):
  return re.sub(rf'^(?:{re.escape(args[0])})+(.*?)(?:{re.escape(args[0])})+$', r'\1', string, flags=re.S)

spam = 'SpamSpamBaconSpamEggsSpamSpam'
print(strip_func(spam, 'Spam'))

См. Python демо . Шаблон ^(?:{re.escape(args[0])})+(.*?)(?:{re.escape(args[0])})+$ создаст такой шаблон, как ^(?:Spam)+(.*?)(?:Spam)+$, и будет соответствовать

  • ^ - начало строки
  • (?:Spam)+ - одно или несколько вхождений Spam в начале строки
  • (.*?) - Группа 1: любые 0 или более символов как можно меньше
  • (?:Spam)+ - одно или несколько вхождений Spam в начале строка
  • $ - конец строки.

flags=re.S также сделает . совпадение символов разрыва строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...