Kyle Hurst
Kyle Hurst

Reputation: 252

Detecting and removing substrings from string

I'm working with URLs and sometimes end up with random repeated phrases in them that are throwing off my scripts. I'd like to remove the duplicates.

So, I start with something like this:

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"

And want to convert that to:

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

All of the solutions I've looked at rely on the spaces between words or the repeating pattern coming at the beginning of the string. In my situation, the repeating pattern(s) don't have those boundaries to base my grouping on.

How can I do this?

Upvotes: 1

Views: 80

Answers (1)

kaya3
kaya3

Reputation: 51044

The first step is going to be to extract the query string and split it into separate parts on the & character; the last step is going to be to join the parts back together with &.

Assuming the duplicates always appear adjacent to each other like in your example input, you can filter them out using itertools.groupby to retain the original order:

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'

If the duplicates might not be adjacent, and you don't need to preserve the order of the parameters in the query string, you can use set to remove the duplicates:

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'

Upvotes: 2

Related Questions