【问题标题】:Replace string with dynamic value in a line using python使用python在一行中用动态值替换字符串
【发布时间】:2018-07-08 09:13:12
【问题描述】:

我有一个文件,基本上它是 json 中的响应,但我可以将它视为文件中的字符串行。我需要用动态值替换键的某些值,例如取值,进行一些计算并替换为该计算值。

例如(日期更改为 +1):

"dateFrom":"Jun 24, 2018 10:00:34 AM""dateFrom":"Jun 25, 2018 10:00:34 AM"

示例字符串是:

line = {"Num":"ML3","dateFrom":"Jun 24, 2018 10:00:34 AM","Val":"mean to","dateTo":"Jun 27, 2018 10:00:34 AM","requestInfo":{"requestIdentifier":"7cecc67d"}}

我试图通过使用正则表达式来解决这个问题,如下所示(“TEST”)是虚拟值,但我必须采用 date 并替换为 date+1

lt = re.sub(r'dateFrom|dateTo.*":(.*AM|PM)(.*)",',"TEST", line, re.IGNORECASE)

最终没有得到正确的输出。

预期:

line = {"Num":"ML3","dateFrom":"Jun 25, 2018 10:00:34 AM","Val":"mean to","dateTo":"Jun 28, 2018 10:00:34 AM","requestInfo":{"requestIdentifier":"7cecc67d"}}

非常感谢任何帮助。

提前致谢。

样本数据是: {"lAttributes":[{"Identifier":{"newIdentifier":{"DDline":"BM","guideIdDate":"Jun 25, 2018 12:00:00 AM","guideNo":"MM","suffix":"A"},"origin":"FRY","destination":"DZ"},"guideOwner":"VX","guideRegistration":"DD","guideType":"44","bestDepartureStatus":"S","bestArrivalTime":"Jun 25, 2018 6:00:00 AM","bestArrivalStatus":"S","bestDepartureTime":"Jun 25, 2018 5:00:00 AM","compartments":[{"code":"DD","guideCapacity":8,"guideBooked":0,"guideForecast":0},{"code":"DD","guideCapacity":10,"guideBooked":0,"guideForecast":0},{"code":"DD","guideCapacity":32,"guideBooked":0,"guideForecast":0},{"code":"DD","guideCapacity":24,"guideBooked":0,"guideForecast":0}]}]}

【问题讨论】:

  • 首先,不是re.IGNORECASE,而是flags=re.IGNORECASE。为什么不使用json
  • 我尝试使用 json,但在替换 key:value 的嵌套级别时遇到了麻烦,所以我认为使用 regx 会更容易。

标签: python python-3.x regex


【解决方案1】:

您可以像这样为字典键分配一个值:

from datetime import datetime, timedelta

line = {"Num":"ML3","dateFrom":"Jun 24, 2018 10:00:34 AM","Val":"mean to","dateTo":"Jun 27, 2018 10:00:34 AM","requestInfo":{"requestIdentifier":"7cecc67d"}}

# Adds 1 day to dateFrom
new_date = datetime.strptime(line["dateFrom"], '%b %d, %Y %I:%M:%S %p') + timedelta(days=1)

# Formats new date as a string and assigns it to dictionary key
line["dateFrom"] = datetime.strftime(new_date, '%b %d, %Y %I:%M:%S %p')

print(line)
>>>{'Num': 'ML3', 'dateFrom': 'Jun 25, 2018 10:00:34 AM', 'Val': 'mean to', 'dateTo': 'Jun 27, 2018 10:00:34 AM', 'requestInfo': {'requestIdentifier': '7cecc67d'}}

如果您需要将 json 字符串表示形式转换为字典(这在您的问题中有点不清楚),您可以使用 json 库:

import json

line = '{"Num":"ML3","dateFrom":"Jun 24, 2018 10:00:34 AM","Val":"mean to","dateTo":"Jun 27, 2018 10:00:34 AM","requestInfo":{"requestIdentifier":"7cecc67d"}}'

line = json.loads(line)

【讨论】:

  • 谢谢,如果我们有一个分层的 json,那么我们可以,但我有嵌套的 json。在那种情况下,我如何才能改变该键的路径。我可以遍历嵌套的 json,但发现很难替换它。有什么建议吗?
  • @BimleshSharma 您可以在您的问题中添加一个“嵌套”示例吗?我有点不清楚你的意思。您应该能够子引用它,例如json_1["json_2"]["dateFrom"]
  • 我们必须替换所有日期字段。我知道它位于固定位置,但 json 太长,我们无法手动引用。我已经添加了有问题的样本。请参考。
  • @BimleshSharma 根据您的示例,您需要遍历所有相关键。它看起来是确定它们的有效方法是所有名称以DateTime 结尾的键。
  • 查找键和值不是问题。在发现用动态更改的值替换这些值之后是一个问题。我可以使用正则表达式,但不确定如何替换该行中所有出现的键值。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多