我想删除此文件每行的前导字符,直到找到数字:
文件如下所示:
* Fail 63779 - Error A
* Fail 64969 - Error B
* Fail 61529 - Error C
* Fail 65068 - Error D
我的输出应如下所示:
63779 - Error A
64969 - Error B
61529 - Error C
65068 - Error D
如果按照失败号的升序输出此输出,那就更好了:
61529 - Error C
63779 - Error A
64969 - Error B
65068 - Error D
答案 0 :(得分:2)
正则表达式\d.*
将匹配字符串中的第一个数字,直到最后一个非换行符。这意味着你可以使用
with open("myfile.txt") as f:
lines = sorted(re.findall("\d.*", f.read()))
获取按字典顺序排序的行列表(不是数字,所以如果数字位数不同,请小心)。
然后你可以把它写回一个像这样的新文件:
with open("output.txt", "w") as f:
f.writelines(lines)
如果需要按数字排序,可以定义辅助函数
def lint(s):
return int(re.match(r"\d+", s).group())
并像这样使用它:
lines = sorted(re.findall("\d.*", f.read()), key=lint)
示例:
>>> s = """* Fail 63779 - Error A
... * Fail 64969 - Error B
... * Fail 61529 - Error C
... * Fail 7068 - Error D"""
>>> sorted(re.findall("\d.*", s), key=lint)
['7068 - Error D', '61529 - Error C', '63779 - Error A', '64969 - Error B']