Регулярное выражение в Python для замены элементов в списке - PullRequest
0 голосов
/ 07 ноября 2018

Это упражнение, которое мы делаем в универе. Я пытаюсь получить все строки k1-9 и p1-9 в текстовом файле и изменить их так, чтобы каждый k (n) = 1 * n и каждый p (n) = 0 * n (то есть p5 = 00000, k3 = 111, р2 = 00). Мне удалось собрать k1-9 и p1-9 в список под названием коды, но я не знаю, как действовать дальше.

import re

with open("suspicious_knitting.txt") as file:
    string = file.read()
    codes = re.findall("k[1-9]|p[1-9]" ,string)

Печать кодов выглядит следующим образом.

['k1', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p3', 'k1', 'p3', 'k1', 'p1', 'k2', 'p1', 'k2', 'p3', 'k1', 'p2', 'k2', 'p1', 'k2', 'p1', 'k1', 'p1', 'k1', 'p1', 'k2', 'p2', 'k3', 'p1', 'k1', 'p2', 'k1', 'p2', 'k2', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p2', 'k2', 'p2', 'k5', 'p2', 'k3', 'p1', 'k1', 'p1', 'k1', 'p2', 'k3', 'p1', 'k2', 'p3']

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вот более классический подход. Я продолжил, основываясь на вашем коде, и просто заменил значения, как описано в комментариях к коду.

    import re

    with open("suspicious_knitting.txt") as file:
        string = file.read()
        codes = re.findall("k[1-9]|p[1-9]" ,string)

        for i in range(len(codes) - 1):
            letter = codes[i][0] # this will be k or p
            number = codes[i][1] # this is number after k/p
            if letter == 'k':
                codes[i] = letter + ('1' * int(number)) # for example, if variable number is 5, 1 will be repeated 5 times
            else:
                codes[i] = letter + ('0' * int(number))

        # now array codes contains desireable values :)
0 голосов
/ 07 ноября 2018

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

import re

text = ' '.join(
    ['k1', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p3', 'k1', 'p3', 'k1', 'p1', 'k2', 'p1', 'k2', 'p3',
     'k1', 'p2', 'k2', 'p1', 'k2', 'p1', 'k1', 'p1', 'k1', 'p1', 'k2', 'p2', 'k3', 'p1', 'k1', 'p2', 'k1', 'p2',
     'k2', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p2', 'k2', 'p2', 'k5', 'p2', 'k3', 'p1', 'k1', 'p1',
     'k1', 'p2', 'k3', 'p1', 'k2', 'p3'])


def repl(match):
    return int(match.group(2)) * match.group(1)


result = re.sub('([kp])([1-9])', repl, text)
print(result)

выход

k p k p k pp k pp k ppp k ppp k p kk p kk ppp k pp kk p kk p k p k p kk pp kkk p k pp k pp kk p k p k pp k pp k pp kk pp kkkkk pp kkk p k p k pp kkk p kk ppp

Объяснение

Шаблон ([kp])([1-9]) соответствует k или p, за которым следует любая цифра от 1 до 9. Для части sub давайте посмотрим на документацию:

Возвращает строку, полученную путем замены крайнего левого непересекающегося вхождения шаблона в строку заменой repl.

Оказывается, что repl может быть функцией, которая получает объект сопоставления . В этом случае repl берет вторую совпадающую группу (количество повторений), приведенную к int, умножается на первую совпадающую группу, букву k или p.

Обратите внимание, что в качестве входных данных я использовал пример вашего вопроса, объединенный пробелом.

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