我试图通过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
子串