【问题标题】:Detecting and removing substrings from string从字符串中检测和删除子字符串
【发布时间】:2020-01-29 05:40:11
【问题描述】:

我正在处理 URL,有时会在其中出现随机重复的短语,这些短语会影响我的脚本。我想删除重复项。

所以,我从这样的事情开始:

url = "https://account.live.com/consent/Manage?fn=email&uaid=51e2193a466c4846a4317b94931b9086&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&lc=1033&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&id=38936&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US&mkt=en-US"

并希望将其转换为:

url = "https://account.live.com/consent/Manage?fn=email&uaid=51e2193a466c4846a4317b94931b9086&lc=1033&id=38936&mkt=en-US"

我研究过的所有解决方案都依赖于单词之间的空格或字符串开头的重复模式。在我的情况下,重复模式没有这些界限来作为我分组的基础。

我该怎么做?

【问题讨论】:

  • 我会做一个split("&"),看看里面有什么,然后可能会从中创建一个set(),希望你最终应该得到唯一的参数("lc=1033", "id=38936", "mkt=en-US"),然后你可以添加一个一个到“根”字符串,我猜是.split("&")[0]
  • 我应该澄清一下......“&”并不总是重复的标识符......有时是“%”,有时是“=”,有时只是一个字母数字字符。这就是为什么我无法使用拆分功能来解决此问题。

标签: python regex python-3.x


【解决方案1】:

第一步是将查询字符串和split 提取到& 字符上的单独部分;最后一步是将join& 一起返回。

假设重复项总是像您的示例输入一样彼此相邻,您可以使用itertools.groupby 将它们过滤掉以保留原始顺序:

import itertools

def remove_duplicate_params(url):
    path, _, query_string = url.partition('?')
    parts = query_string.split('&')
    return path + '?' + '&'.join(k for k, _ in itertools.groupby(parts))

# 'https://account.live.com/consent/Manage?fn=email&uaid=51e2193a466c4846a4317b94931b9086&lc=1033&id=38936&mkt=en-US'

如果重复项可能不相邻,并且您不需要保留查询字符串中参数的顺序,则可以使用set 删除重复项:

def remove_duplicate_params(url):
    path, _, query_string = url.partition('?')
    parts = query_string.split('&')
    return path + '?' + '&'.join(set(parts))

# 'https://account.live.com/consent/Manage?fn=email&mkt=en-US&lc=1033&id=38936&uaid=51e2193a466c4846a4317b94931b9086'

【讨论】:

  • 我应该澄清一下......“&”并不总是重复的标识符......有时是“%”,有时是“=”,有时只是一个字母数字字符。这就是为什么我无法使用拆分功能来解决此问题。
  • @Guimute 与dict 不同,set 不保证保留插入顺序。包括 URL 路径的部分必须留在开头;我已经编辑了使用set 的版本。
  • parts = url.split("&") clean_url = parts[0] + "&".join(param for param in set(parts[1:])) 如果参数可以调换就可以了。
  • @Guimute 最好先在? 上进行分区,以防? 后面的第一个参数重复。但是您的解决方案应该可以正常工作,是的。
  • 当然,老实说,我错过了那个长网址中的?
猜你喜欢
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2021-06-24
相关资源
最近更新 更多