how to loop over a char in a string, one char at time?

Question:

given an input ( http parameters ) with markers ( * ) to the tool, I would like to replace the markers with a string, but just one mark at time

the code:

....
inp = input("http params:" ) # aa=bb*&cc=dd*&ee=ff*
attributes = ["AA","BB","CC"]
mark = "*"
for mark in inp:
    for attribute in attributes:

    data = inp.replace("*", ")("+attribute)  
    print(data)
....

I have this output:

aa=bb)(AA&cc=dd)(AA&ee=ff)(AA
aa=bb)(BB&cc=dd)(BB&ee=ff)(BB
aa=bb)(CC&cc=dd)(CC&ee=ff)(CC
[..]

while I would like to have this:

aa=bb)(AA&cc=dd&ee=ff
aa=bb)(BB&cc=dd&ee=ff
aa=bb)(CC&cc=dd&ee=ff
aa=bb&cc=dd)(AA&ee=ff
aa=bb&cc=dd)(BB&ee=ff
aa=bb&cc=dd)(CC&ee=ff
aa=bb&cc=dd&ee=ff)(AA
aa=bb&cc=dd&ee=ff)(BB
aa=bb&cc=dd&ee=ff)(CC
Asked By: jagghy

||

Answers:

Here, we will gonna need some function to replace on specific number of * instead of replace on all. Moreover, I have reference the following nth_repl fun from here.

Code:

def nth_repl(s, sub, repl, n):
    find = s.find(sub)
    # If find is not -1 we have found at least one match for the substring
    i = find != -1
    # loop util we find the nth or we find no match
    while find != -1 and i != n:
        # find + 1 means we start searching from after the last match
        find = s.find(sub, find + 1)
        i += 1
    # If i is equal to n we found nth match so replace
    if i == n:
        return s[:find] + repl + s[find+len(sub):]
    return s

inp = input("http params:" ) # aa=bb*&cc=dd*&ee=ff*
attributes = ["AA","BB","CC"]

for n in range(1, inp.count('*')+1):
    for attribute in attributes:
        data = nth_repl(inp, "*", f')({attribute}',n)
        print(data)

Or without func:

for i, v in enumerate(inp):
    for attribute in attributes:
        if '*' in v:
            print(inp[:i] + f')({attribute}' + inp[i+1:])

Output:

http params_aa=bb*&cc=dd*&ee=ff*
aa=bb)(AA&cc=dd*&ee=ff*
aa=bb)(BB&cc=dd*&ee=ff*
aa=bb)(CC&cc=dd*&ee=ff*
aa=bb*&cc=dd)(AA&ee=ff*
aa=bb*&cc=dd)(BB&ee=ff*
aa=bb*&cc=dd)(CC&ee=ff*
aa=bb*&cc=dd*&ee=ff)(AA
aa=bb*&cc=dd*&ee=ff)(BB
aa=bb*&cc=dd*&ee=ff)(CC
Answered By: R. Baraiya

This seems like a good use-case for regex, so:

>>> import re
>>> inp = 'aa=bb*&cc=dd*&ee=ff*'
>>> attributes = ["AA","BB","CC"]
>>> for match in re.finditer(r"*", inp):
...     for attr in attributes:
...         left_part = inp[: match.start()]
...         right_part = inp[match.end() :]
...         result = f"{left_part})({attr}{right_part}"
...         print(result)
...
aa=bb)(AA&cc=dd*&ee=ff*
aa=bb)(BB&cc=dd*&ee=ff*
aa=bb)(CC&cc=dd*&ee=ff*
aa=bb*&cc=dd)(AA&ee=ff*
aa=bb*&cc=dd)(BB&ee=ff*
aa=bb*&cc=dd)(CC&ee=ff*
aa=bb*&cc=dd*&ee=ff)(AA
aa=bb*&cc=dd*&ee=ff)(BB
aa=bb*&cc=dd*&ee=ff)(CC
>>>
Answered By: juanpa.arrivillaga
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.