Python中的正则表达式来替换列表中的项目

时间:2018-11-06 22:43:43

标签: python regex python-3.x jupyter-notebook

这是我们正在uni中进行的练习。我正在尝试获取txt文件中的所有k1-9和p1-9字符串并进行更改,以使每个k(n)= 1 * n和每个p(n)= 0 * n(即p5 = 00000,k3 = 111,p2 = 00)。我设法将k1-9和p1-9收集在称为代码的列表中,但我不知道如何进行。

import re

with open("suspicious_knitting.txt") as file:
    string = file.read()
    codes = re.findall("k[1-9]|p[1-9]" ,string)

打印代码是这样的:

['k1', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p3', 'k1', 'p3', 'k1', 'p1', 'k2', 'p1', 'k2', 'p3', 'k1', 'p2', 'k2', 'p1', 'k2', 'p1', 'k1', 'p1', 'k1', 'p1', 'k2', 'p2', 'k3', 'p1', 'k1', 'p2', 'k1', 'p2', 'k2', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p2', 'k2', 'p2', 'k5', 'p2', 'k3', 'p1', 'k1', 'p1', 'k1', 'p2', 'k3', 'p1', 'k2', 'p3']

2 个答案:

答案 0 :(得分:0)

您可以使用sub

import re

text = ' '.join(
    ['k1', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p3', 'k1', 'p3', 'k1', 'p1', 'k2', 'p1', 'k2', 'p3',
     'k1', 'p2', 'k2', 'p1', 'k2', 'p1', 'k1', 'p1', 'k1', 'p1', 'k2', 'p2', 'k3', 'p1', 'k1', 'p2', 'k1', 'p2',
     'k2', 'p1', 'k1', 'p1', 'k1', 'p2', 'k1', 'p2', 'k1', 'p2', 'k2', 'p2', 'k5', 'p2', 'k3', 'p1', 'k1', 'p1',
     'k1', 'p2', 'k3', 'p1', 'k2', 'p3'])


def repl(match):
    return int(match.group(2)) * match.group(1)


result = re.sub('([kp])([1-9])', repl, text)
print(result)

输出

k p k p k pp k pp k ppp k ppp k p kk p kk ppp k pp kk p kk p k p k p kk pp kkk p k pp k pp kk p k p k pp k pp k pp kk pp kkkkk pp kkk p k p k pp kkk p kk ppp

说明

模式([kp])([1-9])kp匹配,后跟19之间的任何数字。对于子部分,我们来看一下文档:

  

返回通过替换最左边的非重叠而获得的字符串   替换代表在字符串中出现模式。

事实证明,repl可以是一个接收match object的函数。在这种情况下,repl将第二个匹配组(重复数)强制转换为与第一个匹配组(字母k或p)相乘的整数。

请注意,在您输入的问题中,我将示例与空格连接起来。

答案 1 :(得分:0)

这是一种更为经典的方法。我根据您的代码继续,只是按照代码注释中的说明替换了值。

    import re

    with open("suspicious_knitting.txt") as file:
        string = file.read()
        codes = re.findall("k[1-9]|p[1-9]" ,string)

        for i in range(len(codes) - 1):
            letter = codes[i][0] # this will be k or p
            number = codes[i][1] # this is number after k/p
            if letter == 'k':
                codes[i] = letter + ('1' * int(number)) # for example, if variable number is 5, 1 will be repeated 5 times
            else:
                codes[i] = letter + ('0' * int(number))

        # now array codes contains desireable values :)