从Pandas中的Regex中提取字符串以用于大型数据集



我们有一个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

最新更新