iT邦幫忙

1

python正則表達式模組re.sub,是否能將要替換的字串當作變數代入?

不明 2021-10-31 11:56:371527 瀏覽
  • 分享至 

  • xImage

我想要利用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模組是否能做到,
或有其它推薦的做法呢?謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
一級屠豬士
iT邦大師 1 級 ‧ 2021-10-31 12:31:10
最佳解答
#!/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)

https://ithelp.ithome.com.tw/upload/images/20211031/20050647TJKPKTqSm4.png

我覺得用 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)
不明 檢舉

謝謝,很優秀的解法

2
海綿寶寶
iT邦大神 1 級 ‧ 2021-10-31 12:10:16

如果不想直上 10 個 replace 的話
看看這篇的第一個答案合不合用
(其實也是串 10 組 key-value,只是用 re 罷了)

不明 檢舉

謝謝分享資源

1
hokou
iT邦好手 1 級 ‧ 2021-11-01 08:04:36

不太會用 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***
不明 檢舉

謝謝分享想法

我要發表回答

立即登入回答