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),正则表达式匹配
(?<![^\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
【讨论】:
您好,非常感谢您的回答。这现在可以正常工作。但是现在我已经尝试了 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_/] 结尾的信息的主要内容,如果未能解决你的问题,请参考以下文章
如何在以特定单词开头并以另一个单词结尾的字符串中出现多次[重复]