【问题标题】:extracting the longest match提取最长匹配
【发布时间】:2019-08-29 01:43:11
【问题描述】:

考虑这个简单的设置

import pandas as pd

df = pd.DataFrame({'id' : [1,2,3],
                   'text' : ['stack-overflow',
                             'slack-overflow',
                             'smack-over']})
df
Out[9]: 
   id            text
0   1  stack-overflow
1   2  slack-overflow
2   3      smack-over

我有一个给定的正则表达式,我想提取 最长 匹配。我知道我可以使用str.extractall 来获取所有匹配项,但是我怎样才能有效地获得最长的匹配项(作为数据框中的列df['mylongest'])?

当然,在这个例子中最长的匹配是溢出、溢出和smack。

df.text.str.findall(r'(\w+)')
Out[10]: 
0    [stack, overflow]
1    [slack, overflow]
2        [smack, over]
Name: text, dtype: object

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    让我们将max 映射到str.findall 的结果。我使用functools.partial 来避免使用 lambda。

    from functools import partial
    
    f = partial(max, key=len)
    df['text'].str.findall(r'(\w+)').map(f)
    
    0    overflow
    1    overflow
    2       smack
    Name: text, dtype: object
    

    【讨论】:

    • 谢谢,但我真的不明白partial 函数。那是原生熊猫的东西吗?我们可以做一个好的 ol lambda func 吗?谢谢!!
    • @ℕʘʘḆḽḘ 替代方案是 df['text'].str.findall(r'(\w+)').map(lambda x: max(x, key=len))。它在标准库中,与 pandas 无关。
    • @ℕʘʘḆḽḘ 我想你会觉得Python: Why is functools.partial necessary?很有趣。
    【解决方案2】:

    如果你想试试pandas

    s=df.text.str.extractall(r'(\w+)')[0]
    s[s.str.len().eq(s.str.len().max(level=0),level=0)]
    Out[51]: 
       match
    0  1        overflow
    1  1        overflow
    2  0           smack
    Name: 0, dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 2011-07-23
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多