user1869582
user1869582

Reputation: 469

Replacing digits with str.replace()

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

Answers (6)

Ahmed
Ahmed

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

user3788060
user3788060

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

LoMaPh
LoMaPh

Reputation: 1720

A solution using translate (source):

remove_digits = str.maketrans('0123456789', '%%%%%%%%%%')
'_u1_v1'.translate(remove_digits)  # '_u%_v%'

Upvotes: 4

DSM
DSM

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

TerryA
TerryA

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

Martijn Pieters
Martijn Pieters

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

Related Questions