I have a input string 12345678901234567890 and I want to use re.sub to match 10th digits to 15th digits in the above string, and replace with * so the desired output will need to be 1234567890*****67890.
import re
string="12345678901234567890"
out = re.sub(".{10}\d{5}.{5}","*",string)
print(out)
Above is my current code, which is not working as expected. Does anyone has an idea on this? Any help would be appreciated.
CodePudding user response:
You can capture 10 digits and match the next 5 digits.
^(\d{10})\d{5}
Then replace with group 1 using \1
and *****
import re
string="12345678901234567890"
out = re.sub(r"^(\d{10})\d{5}",r"\1*****",string)
print(out)
Output
1234567890*****67890
CodePudding user response:
If your input would always have the same width, just use a substring operation:
string = "12345678901234567890"
output = string[0:10] "*****" string[15:]
print(output) # 1234567890*****67890
CodePudding user response:
My two cents, using PyPi's regex module with zero-width lookbehind:
import regex as re
s_in = '12345678901234567890'
s_out = re.sub(r'(?<=^\d{10,14})\d(?=\d*$)', '*', s_in)
print(s_out)
Prints:
1234567890*****67890
I suppose the lookahead is not needed, but since you checking for digits anyway, why not assert that the whole string is made of digits.
Note: This will match digits no matter the lenght of the string.