python - pandas 正则表达式提取函数的行为与 "normal"正则表达式提取不同?

标签 python regex pandas

我尝试通过 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/

相关文章:

python - 如何将二维列表导出为ascii文件?

python - "Clicking"带有请求的按钮

php - 使用正则表达式检查 PHP 中的文件扩展名

matplotlib - 从 Pandas 时间序列图中的Axes.get_xlim()获取可用日期

python - pandas - 检索使用 unstack 函数提取的数据时出现问题用 0 填充空值

python - 为什么我只能从 statsmodels OLS 拟合中获得一个参数

python - 按原始系列索引的时间顺序返回 pandas 日期时间系列

python - 在这种情况下如何使用 Assert?

java - 如何为项目符号空间数字和点编写正则表达式

python - 删除 pandas 系列中仅是标点符号的单词