如何从Pandas Dataframe中提取RegEx并将其用于re.findall

时间:2019-02-05 17:38:33

标签: python regex pandas

当我将所有RegEx表达式存储在HDF5文件中,然后尝试通过pandas数据框提取它们时,我的问题就开始了。

主要问题是,存储在熊猫数据框中的RegEx表达式不能与re.findall一起正常使用。更糟糕的是,我在RegEx表达式中使用了阿拉伯Unicode。

为简化起见,我提供以下示例:

假设我们将以下文本存储在变量中:

mytext = 'الفئران هم حيوانات غير معمرة لأن معدل استقلابهم مرتفع وضربات قلبهم سريعة'

让我们有以下RegEx表达式:

pattern_they = r'([\u0621-\u064a]+\u0647\u0645|\b\u0647\u0645)\b'

如果使用代码print(re.findall(pattern_they, mytext)),我们将获得三个元素的列表:

['هم', 'استقلابهم', 'قلبهم']

现在,如果我们创建一个新模式,其中包括用双引号引起来的pattern_they

pattern_they_new = "r'([\u0621-\u064a]+\u0647\u0645|\b\u0647\u0645)\b'"

然后在print(re.findall(pattern_they_new, mytext))中使用此模式,我们得到一个不正确的空列表。

这里的问题是,我从熊猫数据框中提取的所有RegEx表达式都用双引号引起来,就像pattern_they_new一样。存储RegEx表达式时,我没有添加双引号。当我从熊猫数据框中提取它们时,它们会自动添加。

我尝试不使用r'…'来存储RegEx表达式,但是对re.findall也不起作用。

我该如何解决这个问题?

注意:这个问题是之前另一个问题的跟进: How to store and read RegEx raw strings from pandas dataframe

2 个答案:

答案 0 :(得分:1)

对不起,我发现阿拉伯语很难阅读,因此难以调试。通常,您可以做某事。类似于以下内容:

import re

mytext = "lorem ipsum dolor sit amet"

pattern = r'\b(ipsum)\b'
rx_new = r'{}'.format(pattern)

print(re.findall(rx_new, mytext))

这将正确产生['ipsum']
您还需要在此处添加raw-flag。问题仍然存在:为什么?

答案 1 :(得分:0)

我找到了解决该问题的方法,可以总结如下:

我试图将RegEx表达式存储在HDF5中而不用r'...'进行包装,但是当我随后通过pandas数据帧从HDF5中提取它们时,它们并未被视为原始字符串,因此无法在{{1 }}。相反,我使用了双转义反斜杠,如下所示:

re.findall

但是,当我从熊猫数据框中提取RegEx时,我得到了类似的东西:

pattern_they = '([\\u0621-\\u064a]+\\u0647\\u0645|\\b\\u0647\\u0645)\\b'

因此,我将pattern_they_imported ='([\\\\u0621-\\\\u064a]+\\\\u0646\\\\u0627|\\\\b\\\\u0646\\\\u062D\\\\u0646)\\\\b' replace一起使用了! (我得到了三个元素的列表,这是正确的,如上面我的问题中所述):

re.findall

我想知道为什么我从熊猫数据框中提取的RegEx中的双转义反斜杠变成了四转义反斜杠。无论如何,我的解决方案有效,这对我来说是最重要的。