I have this string a = "a:b/c\\"
and I want to replace : / \\
to _
together
This is my code
b = re.sub(r'[:/\\]*', '_', a)
However, the result is ''_a__b__c__''
and I think it should be a_b_c_
but this method replace the start and end together, how could I change this?
a = "a:b/c\\"
b = re.sub(r'[:/\\]*', '_', a)
print(b)
CodePudding user response:
You're using a character class []
which matches any single character from within that class. However this presents two issues in your particular scenario:
- You've got a two-character-long pattern you're trying to match
\\
- You've quantified it with a
*
, which means "zero or more matches" - at its core your pattern will now basically match on anything since this character class you've declared is now effectively optional.
The solution here is to (a) use a group and alternatives instead of a character class, and (b) eliminate the misused *
quantifier:
import re
a = "a:b/c\\"
b = re.sub(r'(:|/|\\)', '_', a)
print(b) # 'a_b_c_'
Regex101 - this differs slightly because the tool itself does not respect the raw r''
string that Python uses to eliminate the need for escaping the backslash \
characters, regardless it illustrates fundamentally what's happening here.
CodePudding user response:
I have change re.sub(r'[:|/|\\]*', '_', a)
to re.sub(r'[:|/|\\] ', '_', a)
this problem solved, means it need to exist 1 or more.