我正在尝试使用字典来替换字符串中的最后一位数字。我将元素提取到列表中,替换,然后将列表连接回字符串。代码运行但它只替换字典中的第二个元素。
text = "foo 123 doo 342 ghh 568 loo 243"
s = re.split(r'(\d+)', text)
textDict = {"2$":"fg" , "3$":"gh", "8$":"hj"}
for key in textDict:
t = [re.sub(key , textDict[key], x) for x in s]
u = ["".join(t)]
u = str(u)
print u
我期待以下输入
foo 12gh doo 34fg ghh 56hj loo 24gh
但我现在正在
foo 12gh doo 342 ghh 568 loo 24gh
稍微扩展一下问题:
如果我想更改两个最后一位数字,那么我无法使这两种解决方案都无法正常工作。它们都返回原始字符串:
import re
text = "foo 123 doo 342 ghh 568 loo 243"
textDict = {"23":"fg" , "43":"gh", "68":"hj"}
使用解决方案#1:
s = re.split(r'(\d+)', text)
for i in range(len(s) - 2):
s[i] = s[i][:-2] + textDict[s[i][-2]] if s[i][-2] in textDict else s[i]
u = "".join(s)
print u
使用解决方案#2:
result_str = ''
for txt in text.split(' '):
if txt.isdigit() is True:
txt = txt[:-2] + textDict.get(txt[-2], txt[-2])
result_str += (txt + ' ')
result_str.strip()
答案 0 :(得分:3)
此解决方案无需使用re
即可运行。我修改了您的textDict
In [19]: text = "foo 123 doo 342 ghh 568 loo 243"
In [20]: textDict = {"2":"fg" , "3":"gh", "8":"hj"} # modified textDict
In [21]: result_str = ''
In [22]: c_len = 1 # just modify this according to length of dict key
In [23]: for txt in text.split(' '):
...: if txt.isdigit() is True:
...: txt = txt[:-c_len] + textDict.get(txt[-c_len:], txt[-c_len:])
...: result_str += (txt + ' ')
...:
In [24]: result_str.strip() # to remove last space
Out[24]: 'foo 12gh doo 34fg ghh 56hj loo 24gh '
要回答您的问题,只需根据dict密钥长度修改c_len
。
答案 1 :(得分:2)
这样做的一种方法是扭转你的for循环。您可以迭代文本片段,而不是遍历您的键。我认为您不需要使用正则表达式,因为您有一个非常具体的案例。
create sequence SEQ start with 1 increment by 1
这给出了以下输出:
import re
text = "foo 123 doo 342 ghh 568 loo 243"
s = re.split(r'(\d+)', text)
textDict = {"2":"fg" , "3":"gh", "8":"hj"}
for i in range(len(s) - 1):
s[i] = s[i][:-1] + textDict[s[i][-1]] if str(s[i][-1]) in textDict else s[i]
u = "".join(s)
u = str(u)
print u
我相信这也更有效率,因为不是有两个嵌套循环(这给我们> foo 12gh doo 34fg ghh 56hj loo 24gh
的顺序复杂化),你迭代一个列表,这给了我们O(n*m)
。< / p>