【问题标题】:Python : Convert Integers into a Count (i.e. 3 --> 1,2,3)Python:将整数转换为计数(即 3 --> 1,2,3)
【发布时间】:2019-01-03 17:11:53
【问题描述】:

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

目标字符串(输入文件)4FOO2BAR

结果(输出文件)1FOO2FOO3FOO4FOO1BAR2BAR

我的第一个脚本找到了模式并复制到 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

有什么想法吗?

【问题讨论】:

  • 检查python range
  • forrange 会很好地做到这一点。你在哪里写循环?

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


【解决方案1】:

假设您的数字在 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']

【讨论】:

  • 10Foo 怎么样? (更新:没有看到最后一行的说明)
  • Assumes your numbers are between 1 and 9.。我希望 OP 更清楚地了解这是否真的是一个问题。
  • 当然,鉴于 OP 的示例,这非常好。但是,第一行可以理解为“你不需要正则表达式,但前提是你有 Python 3.6+”。
  • @jpp 谢谢!这给了我一个关于如何接近的想法,我正在进入我已经拥有的东西..整数进入两位数,所以我需要调整以超过 1-9
  • @physlexic,我已经更新了一个更通用的解决方案。
【解决方案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+) - 注意+ 符号。

【讨论】:

  • 您可以将其推广到(\d)+ 以支持多位数字。
  • @tobias_k 是的,你说得对。我在我的回答中添加了注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2017-06-04
  • 2015-08-23
  • 1970-01-01
  • 2012-08-07
相关资源
最近更新 更多