这可能比解释我的问题所需要的信息更多,但是我试图将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
的问题上。
有什么想法吗?
答案 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']
更笼统,要说明大于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+)
-注意+
符号。