我是python 3的新手,我正在开发REST API,以格式化包含许多字符串(有时为数千)的JSON中的某些字符,JSON具有以下结构:
[
[
"city",
"Street 158 No 96"
],
[
"city",
"st 144 11a 11 ap 104"
],
[
"city",
"Street83 # 85 - 22"
],
[
"city",
"str13 #153 - 81"
],
[
"city",
"street1h # 24 - 29"
]
]
所以我要在excel宏上替换掉它。
text = Replace(text, "st", " street ", , , vbTextCompare)
For i = 0 To 9 Step 1
text = Replace(text, "street" & i, " street " & i, , , vbTextCompare)
text = Replace(text, "st" & i, " street " & i, , , vbTextCompare)
无论数字如何,这都会将每个单元格格式化为“ street#”,现在的问题是当我尝试使用python进行此操作时,现在我已经学会了如何像这样替换列表中的多个值:
addressList= []
for address in request.json:
address = [element
.replace('st', 'street ')
.replace('street1', 'street 1')
.replace('street2', 'street 2')
.replace('street3', 'street 3')
.replace('street4', 'street 4')
.replace('street5', 'street 5')
#and so on for st too
for element in address]
addressList.append(address)
这种方法不仅时间长而且很丑陋,我想做以前的事情,但是我似乎无法在内部使用a替换,我应该在外部使用吗?
感谢您的帮助。
-编辑-
编辑了json格式,使其有效。
尝试了revliscano和它们都起作用的第四只鸟的回复,目前我使用的是revliscano的方法,因为它允许我仅用“一行”就可以从原始Json创建列表。
答案 0 :(得分:1)
您可以使用匹配st
和可选reet
和可选空格的模式来代替使用多个替换调用,然后在组中捕获1个以上的数字。
\bst(?:reet)? ?(\d+)\b
在替换中,使用捕获组street \1
和re.sub
单个元素的示例代码
import re
element = re.sub(r"\bst(?:reet)? ?(\d+)\b", r"street \1", "st 5")
print (element)
输出
street 5
答案 1 :(得分:0)
我将使用正则表达式解决此问题。尝试以下操作
admit
答案 2 :(得分:0)
您可以将正则表达式与字典混合使用以使其更快。
我在一个程序中使用了这样的功能
import re
def multiple_replace(adict, text):
regex = re.compile("|".join(map(re.escape, adict.keys())))
return regex.sub(lambda match: adict[match.group(0)], text)
adict
是字典,您可以在其中找到要替换的字符的映射。
对您来说可以
adict = {
'street1': 'street 1'
'street2':'street 2',
'street3': 'street 3',
'street4': 'street 4',
'street5': 'street 5',
}
当然,您不能使用完全相同的功能。您将需要根据自己的需要编写另一个正则表达式,就像@The fourth bird
一样