首页 > 解决方案 > 在 pandas 数据框的列中使用正则表达式删除部分 URL 字符串

问题描述

我需要清理一些 url 以删除唯一的跟踪代码,以便在报告时可以将它们计入一个组而不是 1000 个单独的页面。

要删除的代码位于 url 的中间,并且长度不同。

示例网址是

https://www.website.co.uk/product/?commcodeABBB/home-page/

我想得到这个

https://www.website.co.uk/product/home-page/

我有类似的代码用于删除 url 字符串的结尾:

df["URL"] = df["URL"].str.replace('\/id.*','/',regex=True)

我试图为我的新场景修改它。

df["URL"] = df["URL"].str.replace('\/\?commcode.{0,5}','/',regex=True)

在这种情况下,正则表达式\/\?commcode.{0,5}确实选择了 ?commcodeABBB/ 但是我的 URL 中代码字符串的长度会有所不同,因此它不会适用于所有内容。

我无法弄清楚如何编写它,以便它包含从 ?commcode 到并包括下一个 / 的所有内容。我查看了 \w \W 的“中间”,但它不识别/仅识别字母数字字符。

我已经阅读了许多其他关于类似问题的帖子,但没有什么能完全解决我能找到的这个问题。我不能使用从字符串开头或结尾开始计数的代码作为长度变化,网址中 / 的数量也是如此,所以我不能使用 'between 2nd and 3rd / 方法。

请问有什么想法吗?

标签: pythonregexpandas

解决方案


利用

df["URL"] = df["URL"].str.replace(r'/\?commcode[^/]*', '')

证明

解释

--------------------------------------------------------------------------------
  /                        '/'
--------------------------------------------------------------------------------
  \?                       '?'
--------------------------------------------------------------------------------
  commcode                 'commcode'
--------------------------------------------------------------------------------
  [^/]*                    any character except: '/' (0 or more times
                           (matching the most amount possible))

推荐阅读