复制字符串的特定部分并根据正则表达式添加到每行的开头,如果在 Python2 中不匹配则传递
Posted
技术标签:
【中文标题】复制字符串的特定部分并根据正则表达式添加到每行的开头,如果在 Python2 中不匹配则传递【英文标题】:Copy a specific part of a string and addit to the start of each line based on a regex, pass on if not matched in Python2 【发布时间】:2022-01-24 01:13:00 【问题描述】:我有一组哈希值,我希望将 USERNAME 复制到每一行的开头,后跟一个 ':' 符号,然后用更改重写文件。
例如:
$krb5tgs$23$*用户名$realm$test/spn*$12345
会变成:
用户名:$krb5tgs$23$*用户名$realm$test/spn*$12345
输入将从文件中给出。到目前为止,我已经想出了这个,但还没有得到它的工作。
任何有关正确方法的建议将不胜感激。
此正则表达式按预期工作,因此希望将其合并。
'\*(.*?)\$'
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()
第二次尝试:我可以让每一行在开始时都有“TEST:”,但不能完全根据上面的匹配获得 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)
【问题讨论】:
嗨。我在上面写的问题是完全准确的。我已经正确地使用了标记来展示这一点,(我花了一段时间才把它弄好)。 【参考方案1】:用户名似乎由序列$*
引入,并以$
结尾。您应该将其作为正则表达式的一部分。字符串中还有其他以*
开头的内容,因此仅查找该内容可能还不够。我认为\$\*([^$]+)\$
可能会更好。
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)
为输出写入不同的文件可以消除在出现问题时破坏输入文件的风险。
【讨论】:
感谢您的回答,我会试一试,感谢您对正则表达式部分的建议。以上是关于复制字符串的特定部分并根据正则表达式添加到每行的开头,如果在 Python2 中不匹配则传递的主要内容,如果未能解决你的问题,请参考以下文章
可以将特定数字添加到一堆“时间”字符串中,在正则表达式中完成