带有正则表达式的熊猫提取函数的行为与正则表达式提取"normal"不同?



我试图通过str.extract方法从pandas数据帧中提取由换行符分隔的1-n行,这些行位于"开始"(本例中为SOMEWORD)和"停止"字(本例为SOME stop word)之间,但失败了,结果只是NaN。以下提供了示例。

我试图在regex101.com的帮助下构建regex,它在那里工作,甚至当我在jupyter笔记本中从regex101..com复制自动生成的示例代码时,它也会像我期望的那样提取行。

带有pandas str.extract函数的示例代码:

testInput = pd.DataFrame({'text': ['nSOMEWORDn---------- nFirstline with some textnSecondline with some textnThirdline 
with some textnSOME STOP WORDn-------------------n']})
pattern = r'(?<=nSOMEWORDn----------n)(w.+?(?=nSOME STOP WORD))'
test = testInput.iloc[0].str.extract(pattern)
test

输出:

text    NaN
Name: 0, dtype: object

regex101.com的示例代码(我只包含链接,这样帖子就不会太长。在网站上,你还可以复制自动生成的代码,它正在工作,并且只提取起始词和终止词之间的行):https://regex101.com/r/JM6Sgc/1

因此,我的两个问题:

  • 为什么我的regex不能使用pandas-str提取函数
  • 为什么i不需要在pandas extract函数中转义,而是在regex101站点以及"普通"regex代码中转义?示例模式:

    • 成功提取第一行:
      • pattern=r'(?<=\nOMEWORD\n---------------\n)(\w.+)'
    • 提取第一行并输出NaN失败:
      • pattern=r'(?<=\\nSOMEWORD\\n----------------\n)(\w.+)'

您可以放弃查找并确保匹配换行符,并使用re.DOTALL修饰符(可以设置为内联修饰符(?s))重新定义.行为:

r'(?s)nSOMEWORDn----------n(w.+?)nSOME STOP WORD'

查看regex演示

详细信息

  • (?s)-内联re.DOTALL修饰符,使.与包括换行符在内的任何字符匹配
  • nSOMEWORDn----------n-文字子字符串,其中n与文字LF字符匹配
  • (w.+?)-组1(此值将由str.extract返回):一个单词char后面跟着1+个字符,尽可能少
  • nSOME STOP WORD-一个LF和一个SOME STOP WORD子串

最新更新