Как добавить строку после количества появлений нескольких указанных строк - PullRequest
1 голос
/ 31 октября 2019

Я хотел бы добавить строку (не заменить) на основе n-го вхождения нескольких строк.

Пример:

tablespecs = "lcdrcl"

Теперь предположим, что я хочу добавить третье появление l, c и r строки "здесь: ", желаемый результат должен быть:

требуемый_таблицы =" lcd здесь: rcl "

Таким образом, рассматривая только l, c и r, игнорируя d.

Я подошел настолько близко, как показано ниже, вместо добавления кода код заменяет совпадение, поэтому он выдает «lcd here: cl».



tablespecs = "l c d r c l"


def replacenth(string, sub, wanted, n):
    pattern = re.compile(sub)
    where = [m for m in pattern.finditer(string)][n-1]
    before = string[:where.start()]
    after = string[where.end():]
    newString = before + wanted + after

    return newString

#Source of code chunk https://stackoverflow.com/questions/35091557/replace-nth-occurrence-of-substring-in-string


replacenth(tablespecs, "[lcr]", "[here:]", 3) 

#wrong_output: 'l c d [here:] c l'

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Немного другой подход:

tablespecs = "l c d r c l"


def replacenth(string, sub, wanted, n):
    count = 0
    out = ""

    for c in string:
        if c in sub:
            count += 1

        if count == n:
            out += wanted
            count = 0
        out += c
    return out


res = replacenth(tablespecs, "lcr", "here: ", 3)
assert res == "l c d here: r c l", res
1 голос
/ 31 октября 2019

Вы можете установить after, чтобы начать с where.start() вместо where.end(), чтобы он включал этот символ.

tablespecs = "l c d r c l"

def replacenth(string, sub, wanted, n):
    pattern = re.compile(sub)
    where = [m for m in pattern.finditer(string)][n-1]
    before = string[:where.start()]
    after = string[where.start():]
    newString = before + wanted + after
    return newString

replacenth(tablespecs, "[lcr]", "here: ", 3) 

Это выводит 'l c d here: r c l'.

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