Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Pandas数据帧中提取正则表达式并将其与re.findall一起使用_Python_Regex_Pandas - Fatal编程技术网

Python 如何从Pandas数据帧中提取正则表达式并将其与re.findall一起使用

Python 如何从Pandas数据帧中提取正则表达式并将其与re.findall一起使用,python,regex,pandas,Python,Regex,Pandas,我的问题始于我将所有正则表达式存储在一个HDF5文件中,然后试图通过dataframe提取它们 主要问题是存储在pandas dataframe中的正则表达式不能与re.findall一起正常工作。更糟糕的是,我在正则表达式中使用了阿拉伯语Unicode 为了简化问题,我提供以下示例: 假设变量中存储了以下文本: mytext = 'الفئران هم حيوانات غير معمرة لأن معدل استقلابهم مرتفع وضربات قلبهم سريعة' 让我们使用以下

我的问题始于我将所有正则表达式存储在一个HDF5文件中,然后试图通过dataframe提取它们

主要问题是存储在pandas dataframe中的正则表达式不能与re.findall一起正常工作。更糟糕的是,我在正则表达式中使用了阿拉伯语Unicode

为了简化问题,我提供以下示例:

假设变量中存储了以下文本:

mytext = 'الفئران هم حيوانات غير معمرة لأن معدل استقلابهم مرتفع وضربات قلبهم سريعة'
让我们使用以下正则表达式:

pattern_they = r'([\u0621-\u064a]+\u0647\u0645|\b\u0647\u0645)\b'
如果我们使用printre.findallpattern_they,mytext代码,我们将得到三个元素的列表:

['هم', 'استقلابهم', 'قلبهم']
现在,如果我们创建一个新的模式,其中包括模式_,它们用双引号括起来:

pattern_they_new = "r'([\u0621-\u064a]+\u0647\u0645|\b\u0647\u0645)\b'"
然后在printre.findallpattern中使用这个模式,如果它们是新的mytext,我们会得到一个不正确的空列表

这里的问题是,我从pandas数据框架中提取的所有正则表达式都用双引号包装,就像pattern_they_new一样。我在存储正则表达式时没有添加双引号;当我从panda数据框中提取它们时,它们会自动添加

我试图在不使用r'…'的情况下存储正则表达式,但在使用re.findall时也不起作用

我如何解决这个问题

注意:这个问题是之前提出的另一个问题的后续问题:

对不起,我发现阿拉伯语很难阅读,因此很难调试。一般来说,你可以做如下事情:

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']。
您还需要在此处添加原始标志。问题是:为什么?

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

我试图在HDF5中存储正则表达式,但没有用r“…”包装它们,但是当我通过pandas dataframe从HDF5中提取它们时,它们没有被视为原始字符串,因此我无法在re.findall中使用它们。相反,我使用了双转义反斜杠,如下所示:

pattern_they = '([\\u0621-\\u064a]+\\u0647\\u0645|\\b\\u0647\\u0645)\\b'
然而,当我从pandas数据帧中提取正则表达式时,我得到了如下结果:

pattern_they_imported ='([\\\\u0621-\\\\u064a]+\\\\u0646\\\\u0627|\\\\b\\\\u0646\\\\u062D\\\\u0646)\\\\b'
因此,我使用replace替换为re.findall,这很有效!我得到了一个包含三个元素的列表,正如我在上面的问题帖子中所解释的,这是正确的:

print(re.findall(pattern_they_imported.replace('\\\\', '\\'), mytext))

我想知道为什么在我从pandas数据帧提取的正则表达式中,双转义反斜杠变成了四转义反斜杠。无论如何,我的解决方案是有效的,这对我来说是最重要的。

在执行正则表达式之前删除数据帧中的所有双引号是否有问题?有必要吗?嗨,爱德基,我不加双引号。它们是在我将regex存储在dataframe中时添加的。因此,在执行re.findall之前,请使用replace方法删除包含此数据的列/列表中的所有双引号。我尝试了replace方法,但没有成功。您可以发布脚本而不是部分脚本吗?如果不显示代码,就不可能知道您是否正确执行了任何操作。谢谢您的帮助。当我从pandas dataframe读取正则表达式时,实际上得到了如下结果:pattern=r'\bipsum\b'。这就是我提出问题的原因。现在,如果在代码中使用带有双引号的新模式,re.findall将不会给出正确的结果。换句话说,当我从pandas dataframe读取正则表达式时,我并没有得到一个原始字符串,但我得到一个普通字符串,其中包含r'作为字符。