Pandas DataFrame 中的正则表达式 - 查找字符之间的最小长度

Posted

技术标签:

【中文标题】Pandas DataFrame 中的正则表达式 - 查找字符之间的最小长度【英文标题】:Regex within Pandas DataFrame - finding minimum length between characters 【发布时间】:2021-03-11 09:07:39 【问题描述】:

编辑:为重现性而更新

我目前在 Pandas DataFrame 中工作,列 [Column A] 的每一行中都有一个字符串列表。我正在尝试提取关键字列表(列表 B)的任何子列表组合之间的最小距离

ListB = [['abc','def'],['ghi','jkl'],['mno','pqr']]

而 Dataframe 列中的每一行都包含一个字符串列表。

import pandas as pd
import numpy as np

data = pd.DataFrame(np.array([['1', '2', ['random string to be searched abc def ghi jkl','random string to be searched abc','abc random string to be searched def']],
['4', '5', ['random string to be searched ghi jkl','random string to be searched',' mno random string to be searched pqr']],
['7', '8', ['abc random string to be searched def','random string to be searched mno pqr','random string to be searched']]]),
columns=['a', 'b', 'list_of_strings_to_search'])

在较高级别上,我尝试在 data['list_of_strings_to_search'] 中包含的列表中搜索每个字符串以查找 ListB 元素的任何子列表组合(必须同时满足这两个条件),并返回满足以下条件的 ListB 子列表条件,我可以从中计算每个子列表元素对之间的距离(以字为单位)。

import pandas as pd
import numpy as np
import re

def find_distance_between_words(text, word_list):
  '''This function does not work as intended yet.'''

  keyword_list = [] 

  # iterates through all sublists in ListB:
  for i in word_list:
    # iterates through all strings within list in dataframe column:
    for strings in text:
      # determines the two words to search (iterates through word_list)
      word1, word2 = i[0], i[1]
      # use regex to find both words:
      p = re.compile('.*?'.join((word1, word2)))
      iterator = p.finditer(strings)
      # for each match, append the string:
      for match in iterator:
        keyword_list.append(match.group())

    return keyword_list


data['try'] = data['list_of_strings_to_search'].apply(find_distance_between_words, word_list = ListB)
  

预期输出:

0    [abc def, ghi jkl, abc random string to be searched def]
1     [ghi jkl, mno random string to be searched pqr]
2    [abc random string to be searched def, mno pqr]

当前输出:

0    [abc def, abc random string to be searched def]
1                                                 []
2             [abc random string to be searched def]

但是,通过手动检查字符串和输出,大多数正则表达式组合不会从下面的语句中返回,我需要每个字符串中包含所有组合:

for match in iterator:
  keyword_list.append(match.group())

我打算返回每个字符串中存在的所有子列表组合(因此迭代子列表候选值列表),以评估元素之间的最小距离。

非常感谢任何帮助!

【问题讨论】:

您能否解释一下您是如何在预期输出中得到def random string to be searched lmn 的? 我已根据示例 ListB 更新了预期输出 - 谢谢。 【参考方案1】:

让我们在列表解析中遍历list_of_strings_to_search 列中的每个列表,然后对于列表中的每个字符串,使用带有正则表达式模式的re.findall 来查找指定关键字之间长度最小的子字符串:

import re

pat = '|'.join(fr'x.*?y' for x, y in ListB)
data['result'] = [np.hstack([re.findall(pat, s) for s in l]) for l in data['list_of_strings_to_search']]

结果:

0    [abc def, ghi jkl, abc random string to be searched def]
1             [ghi jkl, mno random string to be searched pqr]
2             [abc random string to be searched def, mno pqr]
Name: result, dtype: object

【讨论】:

感谢 Shubham,这是一种比我尝试的嵌套循环更有效的方法! @DJW001 很高兴我能帮上忙 :)

以上是关于Pandas DataFrame 中的正则表达式 - 查找字符之间的最小长度的主要内容,如果未能解决你的问题,请参考以下文章

Pandas DataFrame 中的正则表达式 - 查找字符之间的最小长度

Pandas - 过滤和正则表达式搜索 DataFrame 的索引

pandas DataFrame过滤器正则表达式

使用正则表达式解析多个文本字段并编译成 Pandas DataFrame

pandas.DataFrame.replace 用通配符

Pandas Dataframe - 根据正则表达式条件替换所有单元格值