Reputation: 469
I want to make a new string by replacing digits with %d
for example:
Name.replace( "_u1_v1" , "_u%d_v%d")
...but the number 1
can be any digit for example "_u2_v2.tx"
Can I give replace()
a wildcard to expect any digit? Like "_u"%d"_v"%d".tx"
Or do I have to make a regular expression?
Upvotes: 23
Views: 115032
Reputation: 41
If you want to delete all digits in the string you can do using translate
(Removing numbers from string):
from string import digits
remove_digits = str.maketrans('', '', digits)
str = str.translate(remove_digits)
All credit goes to @LoMaPh
Upvotes: 1
Reputation: 1
temp = re.findall(r'\d+', text)
res = list(map(int, temp))
for numText in res:
text = text.replace(str(numText), str(numText)+'U')
Upvotes: -1
Reputation: 1720
A solution using translate
(source):
remove_digits = str.maketrans('0123456789', '%%%%%%%%%%')
'_u1_v1'.translate(remove_digits) # '_u%_v%'
Upvotes: 4
Reputation: 353589
Just for variety, some non-regex approaches:
>>> s = "_u1_v1"
>>> ''.join("%d" if c.isdigit() else c for c in s)
'_u%d_v%d'
Or if you need to group multiple digits:
>>> from itertools import groupby, chain
>>> s = "_u1_v13"
>>> grouped = groupby(s, str.isdigit)
>>> ''.join(chain.from_iterable("%d" if k else g for k,g in grouped))
'_u%d_v%d'
(To be honest, though, while I'm generally anti-regex, this case is simple enough I'd probably use them.)
Upvotes: 8
Reputation: 60024
Using regular expressions:
>>> import re
>>> s = "_u1_v1"
>>> print re.sub('\d', '%d', s)
_u%d_v%d
\d
matches any number 0-9. re.sub
replaces the number(s) with %d
Upvotes: 41
Reputation: 1125248
You cannot; str.replace()
works with literal text only.
To replace patterns, use regular expressions:
re.sub(r'_u\d_v\d', '_u%d_v%d', inputtext)
Demo:
>>> import re
>>> inputtext = '42_u2_v3.txt'
>>> re.sub(r'_u\d_v\d', '_u%d_v%d', inputtext)
'42_u%d_v%d.txt'
Upvotes: 16