【问题标题】:Extracting text after a phrase and in between spaces from Pandas Dataframe从 Pandas Dataframe 中提取短语后和空格之间的文本
【发布时间】:2021-06-19 00:15:58
【问题描述】:

我有一个 CSV,其中包含一些我要带入 pandas 数据框的数据。其中一列包含像这样的长文本字段的数据:

“QB 亚伦罗杰斯 RB 乔什雅各布斯 FLEX 达万特亚当斯”

我想在 FLEX 之后为该数据帧中的每一行提取玩家名称。我一般是一个正则表达式的新手,尤其是前瞻和后视,但能够使用这段代码直接术语 FLEX

之前获取文本
df.Lineup.str.extract('(\w+(?=\s+FLEX\s))')

但是,我试图获得下一个两个词(全名) FLEX 一词。关于如何让它正常工作的任何想法?

为了更加清楚,在上面的示例中,当前代码导致我返回“Jacobs”,但我想要“Davante Adams”

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    您会得到匹配 Jacobs,因为模式 (\w+(?=\s+FLEX\s)) 匹配 1+ 个单词字符,断言直接在右边的是空格字符,后跟 FLEX。

    相反,您可以使用带有捕获组的模式来匹配 FLEX 之后的 2 个单词:

    \bFLEX\s+(\w+\s+\w+)
    

    Regex demo

    或者更广泛的匹配:

    \bFLEX\s+(\S+\s+\S+)
    
    • \bFLEX一个字边界,匹配FLEX
    • \s+ 匹配 1+ 个空格字符
    • (\S+\s+\S+) 捕获 group 1 匹配 1+ 个非空白字符,1+ 个空白字符,再匹配 1+ 个非空白字符

    查看regex demo

    import pandas as pd
    
    strings = ['QB Aaron Rodgers RB Josh Jacobs FLEX Davante Adams']
    df = pd.DataFrame(strings, columns=["Lineup"])
    df['Lineup'] = df["Lineup"].str.extract(r'\bFLEX\s+(\S+\s+\S+)')
    print(df)
    

    输出

              Lineup
    0  Davante Adams
    

    如果要匹配 2 个或更多单词,可以使用重复的非捕获组:

    \bFLEX\s+(\w+(?:\s+\w+)+)
    

    【讨论】:

    • @RavinderSingh13 谢谢!你可以像这样使用替换 df['Lineup'] = df["Lineup"].str.replace(r'^.*?\bFLEX\s+(\w+\s+\w+).*', r'\1')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多