Если конкретная строка A присутствует в начале и / или конце строки B, как мы можем удалить A из B? - PullRequest
1 голос
/ 02 ноября 2019

Мой вопрос похож, но отличается от следующего:

Как удалить подстроку из конца строки в Python?

Предположим, у нас есть:

input = "baabbbbb_xx_ba_xxx_abbbbbba"

Мы хотим сохранить все, кроме ba в конце и ba в начале.

1) Прямой strip() не удается

strip обрабатывает строку как набор. То есть strip удалит буквы a и b, появляющиеся в любом порядке. Мы хотим удалить символы ba, только если они появляются в , что в точном порядке. Кроме того, в отличие от strip, мы хотим, чтобы с конца строки были удалены только ноль или одна копия. "x \ n \ n \ n \ n" .strip () удалит много новых строк, а не только одну.

input = "baabbbbb_xx_ba_xxx_abbbbbba"
output = input.strip("ba")
print(output)
prints "_xx_ba_xxx_"

2) Сбой Direct replace()

input = "xx_ba_xxx"
output = input.replace("ba", "")
print(output)
# prints `xx__xxx`

Не круто;мы только хотим удалить последовательность "ba" из начала и конца строки, а не из середины.

3) Просто нет

input = "baabbbbb_xx_ba_xxx_abbbbbba"
output = "ba".join(input.rsplit("ba", 1))
print(output)
# output==input

Конечная нота

Решение должно быть общим: функция, принимающая любые две входные строки, одна из которых может не быть "ba". Нежелательные начальные и конечные строки могут содержать «.», «*» и другие символы, которые не подходят для использования в регулярных выражениях.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019

Возможно, вы можете попробовать использовать простое выражение регулярного выражения. Например:

import re
text = "baabbbbb_xx_ba_xxx_abbbbbba"
regex = r"^(ba)(.*)(ba)$"
match = re.search(regex, text)
if (match):
  print(match.group(2))
else:
  print("couldn't match start and end")

> abbbbb_xx_ba_xxx_abbbbb
0 голосов
/ 04 ноября 2019

Мое решение использует базовое хэширование, однако следует помнить о коллизии хэшей. Дайте мне знать, если это поможет вам с вашей проблемой.

import functools


def strip_ed(pattern, string):
    # pattern is not a substring of string
    if len(pattern) > len(string):
        return -1

    base = 26
    # Hash codes for the beginning of the string
    string_hash_beginning = functools.reduce(lambda h, c: h * base + ord(c), string[:len(pattern)], 0)
    # Hash codes for the ending of the string
    string_hash_end = functools.reduce(lambda h, c: h * base + ord(c), string[-len(pattern):], 0)
    # Hash codes for the pattern
    pattern_hash = functools.reduce(lambda h, c: h * base + ord(c), pattern, 0)
    while True:
        if string_hash_beginning == string_hash_end and \
                string_hash_beginning == pattern_hash and \
                string[:len(pattern)] == pattern:
            return string[len(pattern):-len(pattern)]
        elif string_hash_beginning == pattern_hash and string[:len(pattern)] == pattern:
            return string[len(pattern):]
        elif string_hash_end == pattern_hash and string[-len(pattern):] == pattern:
            return string[:-len(pattern)]
        else:
            return string
0 голосов
/ 02 ноября 2019

Это похоже на работу:

def ordered_strip(whole, part):
    center = whole
    if whole.endswith(part):
        center = center[:-len(part)]
    if whole.startswith(part):
        center = center[len(part):]
    return center
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...