我尝试通过 str.extract 从 pandas 数据帧中提取位于“开始”(示例中的某个单词)和“停止”单词(示例中的某个停止词)之间的换行符的 1-n 行 splittet方法,但失败了,结果只是 NaN。 下面提供了示例。
我尝试在 regex101.com 的帮助下构建正则表达式,它可以正常工作,甚至当我在我的 jupyter 笔记本中复制从 regex101.com 自动生成的示例代码时,它也会按照我的预期提取行。
使用 pandas str.extract 函数的示例代码:
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
因此我的两个问题:
- 为什么我的正则表达式不能与 pandas str 提取函数一起使用
为什么我不需要需要在 pandas 提取函数中转义\n 而在 regex101 网站以及“普通”正则表达式代码中?示例模式:
- 成功提取第一行:
- pattern = r'(?<=\nSOMEWORD\n---------\n)(\w.+)'
- 无法提取第一行并输出 NaN:
- pattern = r'(?<=\\nSOMEWORD\\n------------\\n)(\w.+)'
- 成功提取第一行:
最佳答案
您可以放弃环视并确保匹配换行符并使用 re.DOTALL
修饰符(您可以将其设置为内联修饰符,(?s)
):
r'(?s)\nSOMEWORD\n----------\n(\w.+?)\nSOME STOP WORD'
请参阅regex demo
详细信息
(?s)
- 内联re.DOTALL
修饰符,使.
匹配包括换行符在内的任何字符\nSOMEWORD\n---------\n
- 文字子字符串,其中\n
与文字 LF 字符匹配(\w.+?)
- 第 1 组(该值将由str.extract
返回):一个单词字符后跟 1 个以上字符,尽可能少尽可能\nSOME STOP WORD
- 一个 LF 和一个SOME STOP WORD
子字符串
关于python - pandas 正则表达式提取函数的行为与 "normal"正则表达式提取不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53962822/