【问题标题】:Regular expression working in Pythex.com but not in pandas正则表达式在 Pythex.com 中有效,但在 pandas 中无效
【发布时间】:2021-11-29 20:00:05
【问题描述】:

我在将正则表达式函数应用于 python 数据框中的列时遇到问题。它在 Pythex 在线编辑器中运行良好。

这是我的数据框的头部 -

ID Text
1 UMM SURE THE ADDRESS IS IN 25088 KITTAN DRIVE NORTH CAROLINA 28605
2 IT IS ON 26 W STREET 7TH HIGHWAY ORLANDO FLORIDA 28262
3 COOL 757979 EAST TYRON BLVD NEW YORK NEW YORK 29875

我已尝试使用以下代码创建另一列,该列仅提供地址。但新列显示为空。

df['Address']=df['Text'].str.findall('[0-9]{2,6}(?:\s+\S+){3,8}\s{1,}\b(?:FLORIDA|NORTH CAROLINA|NEW YORK)\b')

所需的输出应如下所示 -

ID Text Address
1 UMM SURE THE ADDRESS IS IN 25088 KITTAN DRIVE NORTH CAROLINA 28605 25088 KITTAN DRIVE NORTH CAROLINA
2 IT IS ON 26 W STREET 7TH HIGHWAY ORLANDO FLORIDA 28262 26 W STREET 7TH HIGHWAY ORLANDO FLORIDA
3 COOL 757979 EAST TYRON BLVD NEW YORK NEW YORK 29875 757979 EAST TYRON BLVD NEW YORK NEW YORK

提前致谢。

【问题讨论】:

    标签: regex pandas re findall


    【解决方案1】:

    您可以使用模式从文本列中提取所需的值:

    \b([0-9]{2,6}\b.*?(?:FLORIDA|NORTH CAROLINA|NEW YORK)) \d
    

    模式匹配:

    • \b防止部分单词匹配的单词边界
    • ( 捕获第 1 组
      • [0-9]{2,6}\b 匹配 2-6 位数字,后跟单词边界
      • .*?(?:FLORIDA|NORTH CAROLINA|NEW YORK) 匹配尽可能少的字符,直到您可以匹配其中一个选项
    • ) \d关闭第1组,并匹配一个空格和一个数字

    查看regex demo。

    例如

    import pandas as pd
    
    items = [
        [1, "UMM SURE THE ADDRESS IS IN 25088 KITTAN DRIVE NORTH CAROLINA 28605"],
        [2, "IT IS ON 26 W STREET 7TH HIGHWAY ORLANDO FLORIDA 28262"],
        [3, "COOL 757979 EAST TYRON BLVD NEW YORK NEW YORK 29875"]
    ]
    
    df = pd.DataFrame(items, columns=["ID", "Text"])
    df["Address"] = df["Text"].str.extract(
        r'\b([0-9]{2,6}\b.*?(?:FLORIDA|NORTH CAROLINA|NEW YORK)) \d'
    )
    print(df)
    

    输出

       ID                                               Text                                   Address
    0   1  UMM SURE THE ADDRESS IS IN 25088 KITTAN DRIVE ...         25088 KITTAN DRIVE NORTH CAROLINA
    1   2  IT IS ON 26 W STREET 7TH HIGHWAY ORLANDO FLORI...   26 W STREET 7TH HIGHWAY ORLANDO FLORIDA
    2   3  COOL 757979 EAST TYRON BLVD NEW YORK NEW YORK ...  757979 EAST TYRON BLVD NEW YORK NEW YORK
    

    【讨论】:

      【解决方案2】:

      如果你的文本数据是这种模式的例子,你可以试试下面的代码:

      df['Address']=df['Text'].str.findall(r'[0-9]{2,6}(.*?)(?:\d+$)')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-10
        相关资源
        最近更新 更多