Python 3.x 大数据集Pandas中正则表达式字符串的提取

Python 3.x 大数据集Pandas中正则表达式字符串的提取,python-3.x,regex,pandas,Python 3.x,Regex,Pandas,我们有一个csv文件,每行包含日志条目。 我们需要将每个日志条目中的线程名称提取到一个单独的列中 实现同样的目标最快的方法是什么 对于大型数据集,下面的方法(字符串函数)似乎也需要花费大量时间 我们有csv文件,每个csv文件中至少有100K个条目 这是一段提取路径的代码 df['thread'] = df.message.str.extract(pat = '(\[(\w+.)+?\]|$)')[0] 下面是一个示例日志条目,我们正在挑选: [c.a.j.sprint_planning_re

我们有一个csv文件,每行包含日志条目。 我们需要将每个日志条目中的线程名称提取到一个单独的列中

实现同样的目标最快的方法是什么

对于大型数据集,下面的方法(字符串函数)似乎也需要花费大量时间

我们有csv文件,每个csv文件中至少有100K个条目

这是一段提取路径的代码

df['thread'] = df.message.str.extract(pat = '(\[(\w+.)+?\]|$)')[0]
下面是一个示例日志条目,我们正在挑选:

[c.a.j.sprint_planning_resources.listener.RunAsyncEvent]
从上面的正则表达式

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]
2020-12-01 05:07:36485-0500 ForkJoinPool.commonPool-worker-30 WARN-aives_Chen 245x27568399x23 oxk7fv 10.97.200.99127.0.0.1/browse/MDT-206838[c.a.j.sprint_planning_resources.listener.RunAsyncEvent]已处理的事件:com.atlassian.jira.Event.issue。IssueEvent@5c8703d0[问题=ABC-61381,注释=,工作日志=,变更日志=[一般实体:变更组][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]

有谁知道更好/更快的方法来实现相同的功能吗?

您的正则表达式需要8572个步骤才能完成,请参阅

您可以使用此正则表达式将正则表达式处理显著减少到4个步骤:

\[[^\]]+\]
注意没有
/g
修饰符


您的正则表达式需要8572个步骤才能完成,请参见

您可以使用此正则表达式将正则表达式处理显著减少到4个步骤:

\[[^\]]+\]
注意没有
/g
修饰符

由于嵌套的量词具有与任何字符匹配的未替换的
,因此也与
\w
的功能相匹配,因此
\[(\w+)+?\]
是一种非常低效的模式,可能会导致灾难性的回溯

你可以用

df['thread']=df['message'].str.extract(r'\[(\w+(?:\.\w+*)]),expand=False.fillna(“”)
请参阅。注意,无需添加
$
作为替代,因为
.fillna(“”
将用空字符串替换
NA

正则表达式匹配

  • \[
    -a
    [
    字符
  • (\w+(?:\。\w+*)
    -捕获组1:一个或多个单词字符,后跟零个或多个
    序列和一个或多个单词字符
  • ]
    -一个
    ]
    字符
\[(\w+)+?\]
是一种非常低效的模式,由于嵌套的量词具有与任何字符匹配的未替换的
,因此也与
\w
的功能相匹配,因此可能会导致灾难性的回溯

你可以用

df['thread']=df['message'].str.extract(r'\[(\w+(?:\.\w+*)]),expand=False.fillna(“”)
请参阅。注意,无需添加
$
作为替代,因为
.fillna(“”
将用空字符串替换
NA

正则表达式匹配

  • \[
    -a
    [
    字符
  • (\w+(?:\。\w+*)
    -捕获组1:一个或多个单词字符,后跟零个或多个
    序列和一个或多个单词字符
  • ]
    -一个
    ]
    字符

\[(\w+)+?\]
是一种效率非常低的模式,可能会导致灾难性的回溯。您必须使用
\[(\w+(?:\。\w+)*)]
\[(\w+)+?\]
是一种效率非常低的模式,可能会导致灾难性的回溯。您必须使用
\[(\w+(?:\。\w+)*)]
谢谢,你说得对。我的正则表达式效率低下。尝试了你的解决方案,很快就完成了。对于140K行,每个循环426 ms±44.3 ms的时间输出如下(平均±标准偏差7次运行,每个循环1次)谢谢,你说得对。我的正则表达式效率很低。尝试了你的解决方案,很快就完成了。对于140K行,每个循环的时间输出为426 ms±44.3 ms(7次运行的平均值±标准偏差,每个循环1次)谢谢,你说得对。我的正则表达式效率很低。也尝试了你的解决方案,很快就完成了。对于140K行,每个循环的时间为1.03秒±62.5毫秒(平均±标准偏差为7次运行,每个循环1次),但是,必须对正则表达式df['thread']=df.message.str.extract(pat='10)进行轻微修改((?@shryaneshaw为什么你不逃避应该给你带来问题的
[
?。@shryaneshaw我现在已经将正则表达式缩减为4个步骤。请参阅更新。是的,现在效果更好,每个循环269毫秒±16.3毫秒(平均±标准偏差7次,每个循环1次)对于140K行。@Shreyaneshaw哇,比Wiktor的答案更有效?我从没想过我会看到这样的一天:')谢谢,你是对的。我的正则表达式效率很低。也尝试了你的解决方案,它很快就完成了。对于140K行,它的输出时间如下:每循环1.03秒±62.5毫秒(平均±标准偏差7次,每个循环1次)但是,必须对正则表达式df['thread']=df.message.str.extract(pat='((?@shryyaneshaw)进行轻微修改,为什么您没有避开应该会给您带来问题的
[
?。@shryyaneshaw我现在已将正则表达式缩减为4个步骤。请参阅更新。是的,现在效果更好,每个循环269毫秒±16.3毫秒(平均±标准偏差7次,每次1圈)140K行。@shryyaneshaw哇,比Wiktor的答案更有效?我从没想过我会看到今天:)