当我将所有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
答案 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中的双转义反斜杠变成了四转义反斜杠。无论如何,我的解决方案有效,这对我来说是最重要的。