我们有一个csv文件,每行都包含日志条目。我们需要将每个日志条目中的线程名称提取到一个单独的列中。
实现相同功能的最快方法是什么?
对于大型数据集,下面的方法(字符串函数(似乎也需要花费大量时间。
我们有csv文件,每个csv文件中至少有100K个条目。
这是一段提取路径的代码
df['thread'] = df.message.str.extract(pat = '([(w+.)+?]|$)')[0]
下面是我们挑选的日志条目示例:
[c.a.j.sprint_planning_resources.listener.RunAsyncEvent]
从上面的regex。
2020-12-01 05:07:36,485-0500 ForkJoinPool.commonPool-worker-30 WARN Ives_Chen 245x27568399x23 oxk7fv 10.97.200.99,127.0.0.1 /browse/MDT-206838 [c.a.j.sprint_planning_resources.listener.RunAsyncEvent] Event processed: com.atlassian.jira.event.issue.IssueEvent@5c8703d0[issue=ABC-61381,comment=<null>,worklog=<null>,changelog=[GenericEntity:ChangeGroup][issue,1443521][author,JIRAUSER39166][created,2020-12-01 05:07:36.377][id,15932782],eventTypeId=2,sendMail=true,params={eventsource=action, baseurl=https://min.com},subtasksUpdated=true,spanningOperation=Optional.empty]
有人知道实现相同功能的更好/更快的方法吗?
[(w+.)+?]
是一种效率非常低的模式,由于嵌套的量词具有与任何字符匹配的未标注.
,因此也与w
的作用相匹配,因此可能会导致灾难性的回溯。
你可以使用
df['thread'] = df['message'].str.extract(r'[(w+(?:.w+)*)]', expand=False).fillna("")
请参阅此regex演示。注意,不需要添加$
作为替代,因为.fillna("")
将用空字符串替换NA
。
正则表达式与匹配
[
-一个[
字符(w+(?:.w+)*)
-捕获组1:一个或多个单词字符后接零个或多序列的.
和一个或更多单词字符]
-一个]
字符
您的正则表达式需要8572个步骤才能完成,请参阅https://regex101.com/r/5c3vi7/1
您可以使用此正则表达式将正则表达式处理显著减少到4个步骤:
[[^]]+]
请注意没有/g
修改
https://regex101.com/r/6522P8/1