Python:将整数转换为计数(即3-> 1,2,3)

时间:2018-07-26 16:16:38

标签: python regex backreference capturing-group capture-group

这可能比解释我的问题所需要的信息更多,但是我试图将2个脚本(我为其他用途编写的)组合在一起以进行以下操作。

TargetString(输入文件)4FOO 2BAR

结果(输出文件)1FOO 2FOO 3FOO 4FOO 1BAR 2BAR

我的第一个脚本找到了模式并将其复制到file_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的问题上。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

假设您的数字介于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文件的读写在其他地方:readwrite

更笼统,要说明大于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']

答案 1 :(得分:3)

这个简单的示例不需要使用正则表达式,但是无论如何如果要使用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+)-注意+符号。