我想要利用python正則表達式模組-re做字串替換,
具體來說,
欲將一個由英文、數字組成的字串,將數字找出來替換成星號,
例如:
import re
input_str = 'ab1c2d3'
regex = re.compile(r'(\d+)')
output = regex.sub('*', input_str)
print(output)
這樣可以將數字替換成*
,得到結果ab*c*d*
但我想要的效果是根據數字決定*
的數量,
如看到數字「2」就替換成「2個*」,
範例:
input: 'ab1c2d3'
output: 'ab*c**d***'
欲替換的字串本身想當作變數,用re
模組是否能做到,
或有其它推薦的做法呢?謝謝
#!/usr/local/bin/python3
import re
input_str = 'ab1c2d3'
d = dict([[str(i), '*' * i] for i in range(1,10)])
output_str = re.sub('(\d+)', lambda m: d[m.group()], input_str)
print('input_str =', input_str)
print('output_str =', output_str)
我覺得用 map / reduce 的方法比較好
#!/usr/local/bin/python3
from functools import reduce
input_str = 'ab1c2d3e1f2'
mapping_tuples = tuple([[str(i), '*' * i] for i in range(1,10)])
output_str = reduce(lambda x, kv: x.replace(*kv), mapping_tuples, input_str)
print('input_str =', input_str)
print('output_str =', output_str)
不太會用 re,只想到用 for 來取代
input_str = 'ab1c2d3'
output_str = ''
for a in input_str:
try:
if int(a):
output_str += '*' * int(a)
except:
output_str += a
pass
print(output_str)
# ab*c**d***