Pandas 提取以 [\s\d_/] 开头并以 [\s\d_/] 结尾的信息

Pandas extract information which starts with [\s\d_/] and ends in [\s\d_/]

我正在尝试从以下路径中提取一组关键字,例如 ['lemon'、'apple'、'coconut'] 等 "\var\prj\lemon_123\xyz", "\var\prj3_apple\coconut", "\var\prj\lemonade\coconutapple", “\var\prj\apple\lemon”

预期输出有点复杂:

Paths MatchedKeywords
"/var/prj/lemon_123/xyz" lemon
"/var/prj/123_apple/coconut" apple, coconut
"/var/prj/lemonade/coconutapple"
"/var/prj/apple/lemon" apple, lemon

请记住, 第三行没有以 /、\s、\d 或 _ 开头的确切单词 这就是为什么没有匹配项。 正则表达式有点像这样:\s\d_/[\s\d_/]。 我尝试使用:

df['Paths'].str.findall(r'[^\s\d_/]lemon|apple|coconut[\s\d_/$]', flags=re.IGNORECASE)

但是第三行还是显示'lemon'和'coconut'

提前致谢。

您的正则表达式对于您要匹配的内容不正确,使用 https://regexper.com/ 等可视化工具很容易看出这一点(没有从属关系;只是抓住了顶部 Google 结果)。

您有:[^\s\d_/]lemon|apple|coconut[\s\d_/$]

但可能想要这样的东西:[\s\d_/](lemon|apple|coconut)[\s\d_/]

您可以使用

df['Paths'].str.findall(r'(?<![^\W_])(?:lemon|apple|coconut)(?![^\W_])').str.join(", ")
df['Paths'].str.findall(r'(?<![^\W\d_])(?:lemon|apple|coconut)(?![^\W\d_])').str.join(", ")

参见regex demo (and regex demo #2),正则表达式匹配

  • (?<![^\W_]) - 除了非单词字符和下划线之外,没有紧跟字符的位置(它是从中减去 _ 的左侧单词边界)
  • (?:lemon|apple|coconut) - 匹配组内任何单词的非捕获组
  • (?![^\W_]) - 除了非单词字符和下划线之外没有紧跟字符的位置(它是一个右手边的单词边界,从中减去 _ ).

如果你使用 (?<![^\W\d_])(?![^\W\d_]) 你的单词边界将是 字母 边界,即它将是 \b 带有数字和下划线从中减去。 请参阅 Python 演示:

import pandas as pd
df = pd.DataFrame({"Paths":["/var/prj/lemon_123/xyz", "/var/prj/123_apple/coconut", "/var/prj/lemonade/coconutapple", "/var/prj/apple/lemon"]})
df['Paths'].str.findall(r'(?<![^\W_])(?:lemon|apple|coconut)(?![^\W_])').str.join(", ")
#  0             lemon
#  1    apple, coconut
#  2                  
#  3      apple, lemon
#  Name: Paths, dtype: object