Python: преобразование целых чисел в число (например, 3 - ›1,2,3)

Это может быть больше информации, чем необходимо для объяснения моего вопроса, но я пытаюсь объединить 2 сценария (я написал для других целей) вместе, чтобы сделать следующее.

TargetString (входной_файл) 4FOO 2BAR

Результат (выходной_файл) 1FOO 2FOO 3FOO 4FOO 1BAR 2BAR

Мой первый скрипт находит шаблон и копирует в файл_2

pattern = "\d[A-Za-z]{3}"
matches = re.findall(pattern, input_file.read())
f1.write('\n'.join(matches))

Мой второй сценарий открывает файл output_file и, используя re.sub, заменяет и изменяет целевую строку (строки), используя группы захвата и обратные ссылки. Но я застрял здесь в том, как превратить то есть 3 в 1 2 3.

Любые идеи?


person physlexic    schedule 26.07.2018    source источник
comment
проверьте диапазон Python   -  person Sphinx    schedule 26.07.2018
comment
for и range прекрасно это сделают. Где вы застряли при написании цикла?   -  person Prune    schedule 26.07.2018


Ответы (2)


В этом простом примере не обязательно использовать регулярное выражение, но если вы все равно хотите использовать re, вот пример (обратите внимание: в вашем шаблоне есть небольшая ошибка, она должна быть A-Z, а не A-A):

text_input = '4FOO 2BAR'

import re

matches = re.findall(r"(\d)([A-Za-z]{3})", text_input)

for (count, what) in matches:
    for i in range(1, int(count)+1):
        print(f'{i}{what}', end=' ')

print()

Печать:

1FOO 2FOO 3FOO 4FOO 1BAR 2BAR 

Примечание. Если вы хотите поддерживать несколько цифр, вы можете использовать (\d+) - обратите внимание на знак +.

person Andrej Kesely    schedule 26.07.2018
comment
Вы можете обобщить это на (\d)+ для поддержки многозначных чисел. - person tobias_k; 26.07.2018
comment
@tobias_k Да, ты прав. Ставлю пометку к своему ответу. - person Andrej Kesely; 26.07.2018

Предполагая, что ваши числа от 1 до 9, без регулярного выражения вы можете использовать понимание списка с f-строками (Python 3.6+):

L = ['4FOO', '2BAR']
res = [f'{j}{i[1:]}' for i in L for j in range(1, int(i[0])+1)]

['1FOO', '2FOO', '3FOO', '4FOO', '1BAR', '2BAR']

Чтение и запись в файлы CSV рассматриваются в другом месте: читать, написать.

В более общем виде, чтобы учесть числа больше 9, вы можете использовать itertools.groupby:

from itertools import groupby

L = ['4FOO', '10BAR']

def make_var(x, int_flag):
    return int(''.join(x)) if int_flag else ''.join(x)

vals = ((make_var(b, a) for a, b in groupby(i, str.isdigit)) for i in L)

res = [f'{j}{k}' for num, k in vals for j in range(1, num+1)]

print(res)

['1FOO', '2FOO', '3FOO', '4FOO', '1BAR', '2BAR', '3BAR', '4BAR',
 '5BAR', '6BAR', '7BAR', '8BAR', '9BAR', '10BAR']
person jpp    schedule 26.07.2018
comment
А что насчет 10Foo? (Обновление: не видел пояснения в последней строке) - person tobias_k; 26.07.2018
comment
Assumes your numbers are between 1 and 9.. Я хотел бы получить больше ясности от OP, чтобы увидеть, действительно ли это проблема. - person jpp; 26.07.2018
comment
Конечно, учитывая примеры OP, это нормально. Однако первую строку можно понять, поскольку вам не нужно регулярное выражение, но только если у вас есть Python 3.6+. - person tobias_k; 26.07.2018
comment
@jpp спасибо! это дает мне представление о том, как подойти, я был погружен в то, что у меня уже было ... целые числа переходят в двузначные числа, поэтому мне нужно будет отрегулировать, чтобы выйти за пределы 1-9 - person physlexic; 26.07.2018
comment
@physlexic, я обновился для более общего решения. - person jpp; 26.07.2018