代码之家  ›  专栏  ›  技术社区  ›  physlexic

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

  •  2
  • physlexic  · 技术社区  · 6 年前

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

    目标字符串(输入文件) 4FOO 2BAR

    结果(输出文件) 1FOO 2FOO 3FOO 四福 1BAR 2巴

    我的第一个脚本找到模式并复制到文件

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

    我的第二个脚本打开输出文件,并使用re.sub,使用捕获组和反向引用替换和更改目标字符串。但我被困在了如何转弯的问题上。 3 进入之内 1 2 .

    有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Andrej Kesely    6 年前

    这个简单的例子不需要使用正则表达式,但是如果您想使用 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+) -注意 + 签字。

        2
  •  3
  •   jpp    6 年前

    假设您的数字在1到9之间,没有regex,您可以使用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文件在其他地方有介绍: read , write .

    一般来说,要计算大于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']
    
    推荐文章