![](/img/trans.png)
[英]Replace with regular expression a string with a list of strings in python
[英]Regular Expression in Python to Replace Items in a List
这是我们在大学里做的一个练习。 我试图在 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']
你可以使用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 替换 string 中最左边的不重叠模式出现的字符串。
事实证明, repl
可以是一个接收匹配对象的函数。 在这种情况下, repl
将第二个匹配组(重复次数)强制转换为 int 与第一个匹配组(字母 k 或 p)的乘法。
请注意,我在您的问题中使用空格连接的示例作为输入。
这里有一个更经典的方法。 我继续基于你的代码,只是替换了代码注释中描述的值。
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 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.