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

Posted

技术标签:

【中文标题】Pandas 提取以 [\\s\\d_/] 开头并以 [\\s\\d_/] 结尾的信息【英文标题】:Pandas extract information which starts with [\s\d_/] and ends in [\s\d_/]Pandas 提取以 [\s\d_/] 开头并以 [\s\d_/] 结尾的信息 【发布时间】:2021-08-11 00:00:31 【问题描述】:

我正在尝试从路径中提取一组关键字,例如 ['lemon'、'apple'、'coconut'] 等 "\var\prj\lemon_123\xyz", "\var\prj\123_apple\coconut", "\var\prj\柠檬水\椰子", "\var\prj\苹果\柠檬"

预期的输出有点复杂:

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)

但它仍然在第三行显示“柠檬”和“椰子”。

提前谢谢你。

【问题讨论】:

尝试匹配单词边界 (\b) 【参考方案1】:

你可以使用

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(和regex demo #2),正则表达式匹配

(?&lt;![^\W_]) - 前面没有紧跟非单词字符和下划线的字符的位置(它是左侧单词边界,其中减去了 _(?:lemon|apple|coconut) - 匹配组内任何单词的非捕获组 (?![^\W_]) - 不紧跟非单词字符和下划线以外的字符的位置(它是右侧单词边界,其中减去了 _)。

如果您使用(?&lt;![^\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

【讨论】:

您好,非常感谢您的回答。这现在可以正常工作。但是现在我已经尝试了 1000 个不同的关键字,例如苹果、椰子、柠檬……等等。所以如果我在其中放入 1000 个关键字 findall()。即使其中一些匹配,它也会在输出中显示“NaN”。我怎样才能在里面放 1000 个不同的关键字? @NayanDesale 使用来自this answer 的解决方案。如果您在实施它时需要帮助,请告诉我。 非常感谢维克托。这真的很有帮助!【参考方案2】:

您的正则表达式与您要匹配的内容不正确,使用 https://regexper.com/ 等可视化工具很容易看到这一点(无从属关系;只是抓取了 Google 的最高搜索结果)。

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

但可能想要类似:[\s\d_/](lemon|apple|coconut)[\s\d_/]

【讨论】:

现在只匹配(查找)第一个关键字。从第二行开始,它只匹配 'coconut' 而不是 'apple'。谢谢。 你有倒过来的吗?我分享的正则表达式应该找到apple,但不是coconut,因为椰子不以[\s\d_/]结尾。 是的,你是对的。它正在寻找苹果而不是椰子。我很抱歉我的错误评论。但是我们怎样才能得到它们呢?并使用特定的正则表达式?

以上是关于Pandas 提取以 [\s\d_/] 开头并以 [\s\d_/] 结尾的信息的主要内容,如果未能解决你的问题,请参考以下文章

匹配以 2 个字母开头并以 3 个字母结尾的正则表达式

python 返回以start开头并以end结尾的子字符串

提取并以十进制返回 RGBA 颜色的各个分量

如何在以特定单词开头并以另一个单词结尾的字符串中出现多次[重复]

怎么提取mysql数据库表中的内容,并以表格形式显示在页面上。

set<string>:如何列出不以给定字符串开头并以`/`结尾的字符串?