【问题标题】:Python replace in JSON list with for loop?用for循环替换JSON列表中的Python?
【发布时间】:2020-07-28 23:08:19
【问题描述】:

我是 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)

无论数字如何,这都会将每个单元格格式化为“街道#”,现在问题是当我尝试使用 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)

这个方法不仅长而且真的很丑,我想做一些像以前一样的东西,但是我似乎无法在replace内部使用for,我应该在外面做吗?

感谢您的帮助。

--编辑--

编辑了 json 格式,使其有效。

尝试了 revliscano 和第四只鸟的回复,它们都有效,目前我正在使用 revliscano 的方法,因为它允许我在“一行”中从我的原始 Json 创建列表

【问题讨论】:

  • 这不是有效的 JSON 结构。 {} 包围对象,格式为key: value
  • 您可以在此链接jsonlint.com中检查您的JSON格式是否有效

标签: python json python-3.x replace formatting


【解决方案1】:

您可以使用匹配st 与可选reet 和可选空格的模式,而不是使用多个替换调用,然后在一个组中捕获1+ 个数字。

\bst(?:reet)? ?(\d+)\b

Regex demo | Python demo

在替换中使用捕获组street \1 使用re.sub

单个元素的示例代码

import re
element = re.sub(r"\bst(?:reet)? ?(\d+)\b", r"street \1", "st 5")
print (element)

输出

street 5

【讨论】:

    【解决方案2】:

    我会使用正则表达式来解决这个问题。试试下面的

    import re
    
    address_list = [[re.sub(r'(?:st ?(\d)?\b)|(?:street(\d))', r'street \1', element)
                    for element in address]
                    for address in request.json]
    

    【讨论】:

      【解决方案3】:

      您可以将正则表达式与字典混合使用以使其更快。

      我在我的一个程序中使用了这样的功能

      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 did

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多