这是我们正在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']
答案 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])
与k
或p
匹配,后跟1
和9
之间的任何数字。对于子部分,我们来看一下文档:
返回通过替换最左边的非重叠而获得的字符串 替换代表在字符串中出现模式。
事实证明,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 :)