带有regex的提取函数的行为与“正常”regex提取不同?

2024-05-19 03:02:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试通过从一个pandas数据帧中提取1-n行,这些行由一个“start”(示例中的SOMEWORD)和一个“stop”字(示例中的somestop word)之间的换行符拆分结构提取物方法,但它失败了,结果就是。 示例如下。你知道吗

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

熊猫示例代码结构提取物功能:

testInput = pd.DataFrame({'text': ['\nSOMEWORD\n---------- \nFirstline with some text\nSecondline with some text\nThirdline 
with some text\nSOME STOP WORD\n-------------------\n']})
pattern = r'(?<=\nSOMEWORD\n----------\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不能使用extract函数
  • 为什么我不需要在pandas extract函数中转义\n而在regex101站点和“普通”regex代码中转义?模式示例:

    • 成功提取第一行:
      • 图案=r'(?<;=\n单词\n------\n)(\w.+)'
    • 无法提取第一行并输出NaN:
      • 图案=r'(?<;=\\n单词\\n------\\n)(\w.+)'

Tags: 代码textcom示例pandaswithextractsome
1条回答
网友
1楼 · 发布于 2024-05-19 03:02:07

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

r'(?s)\nSOMEWORD\n     \n(\w.+?)\nSOME STOP WORD'

参见regex demo

细节

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

相关问题 更多 >

    热门问题