我有一组散列,我希望将USERNAME复制到每行的开头,后面跟着一个":"符号,然后用更改重写文件。
例如:
$krb5tgs$23$*USERNAME$realm$test/spn*$1345
将变成:
用户名:$krb5tgs$23$*用户名称$srealm$test/spn*$1345
输入将从文件中给出。到目前为止,我已经想出了这个办法,但还没有成功。
如有任何关于正确做法的建议,我们将不胜感激。
这个正则表达式可以按预期工作,因此希望将其合并。
'*(.*?)$'
L=file.txt
file_object = open(L, 'a+')
while True:
lines = file_object.readline()
match = re.search(r'*(.*?)$', lines)
if match:
for line in fileinput.input([L], inplace=1):
sys.stdout.write('TEST'.format(l=lin))
else:
pass
if not lines:
break
file_object.close()
第二次尝试:我可以让每一行都有"测试:";一开始,但无法根据上面的匹配得到一个if语句或类似的工作。
with open(L, 'r') as f:
lines = f.readlines()
lines = ['TEST:' + line for line in lines]
with open(L, 'w') as f:
f.writelines(lines)
用户名似乎是由序列$*
引入的,并以$
结尾。您应该将该部分作为正则表达式。字符串中还有其他以*
开头的内容,因此仅查找它可能是不够的。我认为$*([^$]+)$
可能更好。
re.search()
返回一个匹配对象,即None
,因此很容易看出何时修改一行,何时不修改它。
此外,养成使用上下文管理器(with
块(处理文件的习惯,而不是手动调用.close()
。
username_re = re.compile(r'$*([^$]+)$')
with open('file.txt', 'r') as f:
lines = list(f)
with open('file.txt', 'w') as f:
for line in lines:
match = username_re.search(line)
if match:
line = match.group(1) + ':' + line
f.write(line)
为输出写入不同的文件消除了在出现错误时破坏输入文件的风险。