gpt4 book ai didi

用于在两个常量字符串之间搜索变量字符串的 Python 脚本

转载 作者:行者123 更新时间:2023-12-01 03:44:15 25 4
gpt4 key购买 nike

import re

infile = open('document.txt','r')
outfile= open('output.txt','w')
copy = False
for line in infile:

if line.strip() == "--operation():":
bucket = []
copy = True

elif line.strip() == "StartOperation":
for strings in bucket:
outfile.write( strings + ',')
for strings in bucket:
outfile.write('\n')
copy = False

elif copy:
bucket.append(line.strip()

CSV 格式如下:

id,          name,                poid,         error
5896, AutoAuthOSUserSubmit, 900105270, 0x4002

我的日志文件有几个部分,以 ==== START ==== 开头,以 ==== END ==== 结尾。我想提取 --operation():StartOperation 之间的字符串。例如,AutoAuthOSUserSubmit。 我还想从行 poid: 900105270, poidLen: 9 中提取 poid 值。最后,我想提取返回值,例如如果在其后找到Roll back all update,则为0x4002

如果 StartEnd 不在同一行,我什至无法提取原始文本。我该如何去做呢?

这是包含两个段落的示例日志摘录:

-- 08/24 02:07:56 [mds.ecas(5896) ECAS_CP1] **==== START ====**
open file /ecas/public/onsite-be/config/timer.conf failed
INFO 08/24/16 02:07:56 salt1be-d1-ap(**5896**/0) main.c(780*****):--operation(): AutoAuthOSUserSubmit. StartOperation*****
INFO 08/24/16 02:07:56 salt1be-d1-ap(5896/0) main.c(784):--Client Information: Request from host 'malt-d1-wb' process id 12382.
DEBUG 08/24/16 02:07:56 salt1be-d1-ap(5896/0) TOci.cc(571):FetchServiceObjects: ServiceCert.sql
DEBUG 08/22/16 23:15:53 pepper1be-d1-ap(2680/0) vsserviceagent.cpp(517):Generate Certificate 2: c1cd00d5c3de082360a08730fef9cd1d
DEBUG 08/22/16 23:15:53 pepper1be-d1-ap(2680/0) junk.c(1373):GenerateWebPin : poid: **900105270**, poidLen: 9
DEBUG 08/22/16 23:15:53 pepper1be-d1-ap(2680/0) junk.c(1408):GenerateWebPin : pinStr
DEBUG 08/24/16 02:07:56 salt1be-d1-ap(5896/0) uaadapter_vasco_totp.c(275):UAVascoTOTPImpl.close() -- Releasing Adapter Context
DEBUG 08/22/16 23:15:53 pepper1be-d1-ap(2680/0) vsenterprise.cpp(288):VSEnterprise::Engage returns 0x4002 - Unknown error code **(0x4002)**
ERROR 08/22/16 23:15:53 pepper1be-d1-ap(2680/0) vsautoauth.cpp(696):OSAAEndUserEnroll: error occurred. **Roll back** all updates!
INFO 08/24/16 02:07:56 salt1be-d1-ap(5896/0) uaotptokenstoreqmimpl.cpp(199):Close token store
INFO 08/24/16 02:07:56 salt1be-d1-ap(5896/0) main.c(990):-- EndOperation
-- 08/24 02:07:56 [mds.ecas(5896) ECAS_CP1] **==== END ====**
OPERATION = AutoAuthOSUserSubmit, rc = 0x0 (0)
SYSINFO Elapse = 0.687, Heap = 1334K, Stack = 64K

最佳答案

这看起来像是正则表达式的工作!事实上有几个。值得庆幸的是,在这种情况下它们的使用并不是很复杂。

有两个主要观察结果会让我选择正则表达式而不是其他东西:

  1. 需要从两个已知常量值之间提取一位变量文本
  2. 需要对不同的字符串多次遵循相同的模式

你可以尝试这样的事情:

import re

def capture(text, pattern_string, flags=0):
pattern = re.compile(pattern_string, flags)
match = pattern.search(text)
if match:
output = match.group(1)
print '{}\n'.format(output)
return output
return ''

if __name__ == '__main__':
file = read_my_file()

log_pattern = "\*\*==== START ====\*\*(.+)\*\*==== END ====\*\*"
log_text = capture(file, log_pattern, flags=re.MULTILINE|re.DOTALL)

op_pattern = "--operation\(\): (.+). StartOperation\*\*\*\*\*"
op_name = capture(log_text, op_pattern)

poid_pattern = "poid: \*\*([\d]+)\*\*, poidLen: "
op_name = capture(log_text, poid_pattern)

retcode_pattern = "Unknown error code \*\*\((.+)\)\*\*.+\*\*Roll back\*\* all updates!"
retcode = capture(log_text, retcode_pattern, flags=re.MULTILINE|re.DOTALL)

这种方法本质上将问题分为几个基本上独立的步骤。我在每个正则表达式中使用捕获组 - 像 (.+)([\d]+) 这样的括号 - 在常量字符的长字符串之间。多行和 dotall 标志使您可以轻松处理文本中的换行符,并像对待字符串的任何其他部分一样对待它们。

我在这里还做了一个很大的假设,那就是您的日志不是大文件,最多可能有几百兆字节。请注意对 read_my_file() 的调用- 我没有尝试一次一行地解决这个问题,而是选择读取整个文件并在内存中工作。如果文件变得非常大,或者您正在构建一个会获得大量流量的应用程序,这可能是一个坏主意。

希望这有帮助!

关于用于在两个常量字符串之间搜索变量字符串的 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39175350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com