python - 使用 Python 从语义上检测文本块
问题描述
我有这个示例日志文本块:
20190122 09:00,000 ###PERFORMANCE string1 string2 string3
20190122 09:10,500 number1 string1 string2 string3
20190122 09:24,670 number2 string1 string2 string3
20190122 10:05,000 number3 string1 string2 string3
20190122 10:33,960 number4 string1 string2 string3
20190122 11:00,321 number5 string1 string2 string3
20190122 11:40,256 ###PERFORMANCE string1 string2 string3
20190123 10:24,670 number1 string1 string2 string3 string4 date1 number2
20190123 10:32,130 number1 string1 string2 string3 string4 date1 number2
20190123 08:00,000 ###PERFORMANCE string1 string2 string3
20190123 08:10,500 number1 string1 string2 string3
20190123 08:24,670 number2 string1 string2 string3
20190123 09:05,000 number3 string1 string2 string3
20190123 10:33,960 number4 string1 string2 string3
20190123 10:00,321 number5 string1 string2 string3
20190123 13:40,256 ###PERFORMANCE string1 string2 string3
20190124 10:00,000 ###PERFORMANCE string1 string2 string3
20190124 10:10,500 number1 string1 string2 string3
20190124 10:24,670 number2 string1 string2 string3
20190124 11:05,000 number3 string1 string2 string3
20190124 12:33,960 number4 string1 string2 string3
20190124 13:00,321 number5 string1 string2 string3
20190124 13:40,256 ###PERFORMANCE string1 string2 string3
我想用 Python 做的是检测每个###PERFORMANCE
文本块,如下例所示:
如您所见,有 3 个感兴趣的块,每个块由###PERFORMANCE
字符串中的文本分隔。第一个从第 1 行开始,到第 7 行结束。第 7 行和第 10 行之间的内容不得视为感兴趣的块。每个块的字符串行也可能有所不同(因此按行数不是一个好主意)。
到目前为止,我所做的只是逐行读取文本文件:
logFile = "testLog.txt"
with open(logFile) as f:
content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]
for line in content:
print(line)
我可以通过哪种方式来完成这项任务?使用 NLTK 是个好主意吗?它甚至可以完成这项任务吗?有什么一般性的建议吗?
解决方案
由于您只是在 PERFORMANCE 分隔符上进行匹配,因此使用 NLTK 似乎有点矫枉过正。一个简单的方法是使用一个简单的匹配(是行上的预期字符串),然后根据它切换您的捕获模式。例如:
in_block = False
IDENTIFIER = 'PERFORMANCE'
with open(logfile) as f:
for line in f.readlines():
if IDENTIFIER in line:
# Toggle the boolean
in_block = not in_block
if in_block:
print(line)
推荐阅读
- docker - Hyperledger-fabric 区块链多主机
- wpf - 如何修复“InvalidOperationException:必须在 ShaderEffect 上设置 PixelShader”VS2017 错误?
- json - 使用引用验证 Json 架构
- scala - 无法在 playframework 2.6.17 中解析 mock[....]
- android - 将参数传递给 strings.xml ANDROID 中的字体大小
- typescript - 打字稿类创建多次调用
- mysql - 上一年的 SQL 运行总计
- python - Pandas - 在 CSV 文件的不同列中找到相同值的更快方法?
- freeswitch - 有没有可能我可以知道谁在 FreeSwitch 中发言?
- java - 使用列表参数将 HQL 查询转换为可执行的 SQL 查询