Replacing digits with str.replace()
Asked Answered
S

6

23

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?

Seismism answered 29/9, 2013 at 23:23 Comment(1)
it doesn't make sense you are replacing a value with any digit. you have to define the digit. if you have some function that defines the digit or takes input, pass in the variable that holds the value. For instance, Name.replace("_u1_v1", "_u" + variableName + "_v" + variableName).Embezzle
H
41

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

Hinduism answered 29/9, 2013 at 23:24 Comment(0)
V
16

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'
Vinic answered 29/9, 2013 at 23:24 Comment(0)
P
8

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.)

Puton answered 29/9, 2013 at 23:30 Comment(0)
U
4

A solution using translate (source):

remove_digits = str.maketrans('0123456789', '%%%%%%%%%%')
'_u1_v1'.translate(remove_digits)  # '_u%_v%'
Undergo answered 4/12, 2019 at 23:30 Comment(0)
R
1

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

Rectangle answered 25/4, 2020 at 16:16 Comment(0)
B
-1
temp = re.findall(r'\d+', text) 
res = list(map(int, temp))

for numText in res:
    text = text.replace(str(numText), str(numText)+'U')
Bannasch answered 15/4, 2020 at 7:24 Comment(2)
Can you please explain your solution?Via
It would be helpful if you added some clarifying description of the solution you have suggested, instead of only providing code. Code can stand alone, but it's always better when you explain why you do something, instead of just how. Read more about writing a good answer here: stackoverflow.com/help/how-to-answerTurgot

© 2022 - 2024 — McMap. All rights reserved.