【问题标题】:Match ordered table of regex to text将正则表达式的有序表与文本匹配
【发布时间】:2021-07-08 08:24:53
【问题描述】:

尝试尽可能高效地将包含复杂正则表达式(大量前瞻和后瞻)的大型表(1,500 个表达式)与包含文本数据的大型 pandas 数据框(10 亿行)进行匹配,并返回匹配的正则表达式的 ID .

示例正则表达式:

regex = pd.DataFrame({'matchregex' : ['(^(?!.*?(external|internal)).*?(test string))',
                                      '(^(?!.*?(big|small)).*?(testing string))',
                                      '(^(?=.*?(automatic|internal)).*(string (one|two)))'],
                     'id' : [1,2,3]})

样本数据:

data = pd.DataFrame({'ID' : [1,2,3,4],
                     'TextString' : ['External Test String','123 Test String','Automatic String One','String two']})

所需的输出是一个新的数据帧,其中包含 ID、TextString 和来自正则表达式数据帧的匹配 ID。

我已经尝试过这种方法 - https://toltman.medium.com/matching-multiple-regex-patterns-in-pandas-121d6127dd47

但是,它会提取匹配组,并且由于每个表达式中都有匹配组,它往往会抛出错误的东西。它也非常慢。

理想情况下,我会避免在表之间进行笛卡尔连接,然后将字符串与每个表达式进行比较,因为临时数据将超过 1 tn 记录。最好的情况是,一旦订单中的第一个表达式与字符串匹配,它将忽略该记录的剩余表达式。

【问题讨论】:

  • 如果你能分享一下你到目前为止所尝试的,那就更好了。
  • 谢谢@PoojaSonkar - 我已经在上面添加了一个链接到所尝试的内容。我也尝试过使用 sql 环境进行匹配,但还没有找到一种方法来避免将所有字符串与所有表达式进行比较。由于复杂的正则表达式,我的选择似乎有限。

标签: python regex pandas


【解决方案1】:

如果这样更有效率,你可以试试:

import re

ids = [1,2,3]
patterns = ['(^(?!.*?(external|internal)).*?(test string))',
            '(^(?!.*?(big|small)).*?(testing string))',
            '(^(?=.*?(automatic|internal)).*(string (one|two)))']

regexes = {i: re.compile(pattern, re.IGNORECASE)
           for i, pattern in zip(ids, patterns)}

def check(s):
    for i, pattern in regexes.items():
        if pattern.search(s):
            return i
    return 0

data['Match'] = data.TextString.map(check)

结果(print(data)):

   ID            TextString  Match
0   1  External Test String       0
1   2       123 Test String       1
2   3  Automatic String One       3
3   4            String two       0

在check 中,我使用0 而不是None 作为返回空结果以避免将Match 列转换为float。如果您不喜欢这种方式,请更改它。

【讨论】:

  • 谢谢!这是完美的 - 10k 条记录大约需要 110 秒,并且能够扩展和并行化。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多