【问题标题】:Regex extract full capture group正则表达式提取完整捕获组
【发布时间】:2021-01-22 06:40:00
【问题描述】:

我正在尝试提取 URL,但我只得到最后一部分,如“com”,而不是完整的“amazon.com”或“google.com”。我正在使用以下正则表达式:

data = [['website is amazon.com'], ['url is google.com']] 
reviews = pd.DataFrame(data, columns = ['ALL_TEXT']) 
reviews['regex_match'] = reviews['ALL_TEXT'].str.extract(r'[^@A-Z][-A-Z0-9:%_\+~#=]+\.(CO|COM|NET|ORG|GOV)\b', flags=re.IGNORECASE)

我尝试在完整的正则表达式周围使用捕获组

reviews['regex_match'] = reviews['ALL_TEXT'].str.extract(r'([^@A-Z][-A-Z0-9:%_\+~#=]+\.(CO|COM|NET|ORG|GOV)\b)', flags=re.IGNORECASE)

但我得到了错误

Wrong number of items passed 2, placement implies 1

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    错误意味着您将 Series.str.extract 的结果分配到单个列 (reviews['regex_match']),但您的正则表达式包含 两个 捕获组,即您告诉它返回两列。

    你可以使用

    >>> reviews['ALL_TEXT'].str.extract(r'(?<![@A-Z])([-A-Z0-9:%_+~#=]+\.(?:COM?|NET|ORG|GOV))\b', flags=re.I)
                0
    0  amazon.com
    1  google.com
    

    详情

    • (?&lt;![@A-Z]) - 如果在当前位置的左侧有 @ 或 ASCII 字母,则匹配失败

    • ([-A-Z0-9:%_+~#=]+\.(?:COM?|NET|ORG|GOV)) - 捕获组 1(这将由 Series.str.extract 返回):

      • [-A-Z0-9:%_+~#=]+ - 一个或多个 ASCII 字母/数字、-:%_+~#= 字符
      • \. - 一个 . 字符
      • (?:COM?|NET|ORG|GOV) - 匹配 cocomnetorggovnon-capturing group
    • \b - 单词边界。

    因此,您只使用 单个捕获组 来返回您在 = 运算符左侧定义的单个列的值,如果您需要对任何两个或多个模式进行分组,您只需使用非捕获组。

    【讨论】:

      【解决方案2】:

      您收到该错误是因为您传递了 2 个捕获组。您可以使用 (?: 的非捕获组作为扩展,并使用单个捕获组作为完整模式。

      ([^@A-Z][-A-Z0-9:%_+~#=]+\.(?:COM?|NET|ORG|GOV))\b
                                 |__________________|
                                   Non capture group
      |______________________________________________|
                        Capture group
      

      更新后的代码如下所示

      reviews['regex_match'] = reviews['ALL_TEXT'].str.extract(
          r'([^@A-Z][-A-Z0-9:%_+~#=]+\.(?:COM?|NET|ORG|GOV))\b',
          flags=re.IGNORECASE
      )
      

      输出

                      ALL_TEXT  regex_match
      0  website is amazon.com   amazon.com
      1      url is google.com   google.com
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 2018-03-11
        • 1970-01-01
        • 2014-05-28
        相关资源
        最近更新 更多