Problem:我试图用Python中的另一个浮点表示的多个特定序列替换字符串中的多个特定序列.

我在JSON文件中有一个字符串数组,我通过JSON模块将其加载到python脚本中.

{
  "LinesToReplace": [
    "_ __ ___ ____ _____ ______ _______      ",
    "_._ __._ ___._ ____._ _____._ ______._  ",
    "_._ _.__ _.___ _.____ _._____ _.______  ",
    "_._ __.__ ___.___ ____.____ _____._____ ",
    "_. __. ___. ____. _____. ______.        "
  ]
}

我通过JSON模块加载JSON文件:

with open("myFile.json") as jsonFile:
  data = json.load(jsonFile)

我试图用浮点表示的特定子字符串替换_的序列.

Specification:

  • 要在字符串中查找的字符必须是单个_或多个_的序列.
  • _序列的长度未知.
  • 如果单个_或多个_的序列后面紧跟着一个.,然后又紧跟着一个_或多个_的序列,则_序列中的. is part.
  • .用于指定小数
  • 如果.后面没有一个_或多个_的序列,则._序列的is not part.
  • _.的序列替换为浮点表示,即%f1.0.
  • 表示取决于_.序列.

Examples:

  • __将被%f2.0所取代.
  • _.___将被%f1.3所取代.
  • ____.__将被%f4.2所取代.
  • ___.将被%3.0所取代.

对于上述JSON文件,结果应该是:

{
  "ReplacedLines": [
    "%f1.0 %f2.0 %f3.0 %f4.0 %f5.0 %f6.0 %f7.0      ",
    "%f1.1 %f2.1 %f3.1 %f4.1 %f5.1 %f6.1  ",
    "%f1.1 %f1.2 %f1.3 %f1.4 %f1.5 %f1.6  ",
    "%f1.1 %f2.2 %f3.3 %f4.4 %f5.5 ",
    "%f1.0. %f.0. %f3.0. %f4.0. %f5.0. %f6.0.        "
  ]
}

一些代码,试图用%f1.0代替单个_(这不起作用…):

with open("myFile.json") as jsonFile:
  data = json.load(jsonFile)
  strToFind = "_"
  
  for line in data["LinesToReplace"]:
    for idl, l in enumerate(line):
      if (line[idl] == strToFind and line[idl+1] != ".") and (line[idl+1] != strToFind and line[idl-1] != strToFind):
        l = l[:idl] + "%f1.0" + l[idl+1:] # replace string

有什么办法吗?我也想过如何使用正则表达式.

推荐答案

您可以将正则表达式的re.sub与一个替换函数一起使用,该函数在捕获组上执行逻辑:

import re

def replace(line):
    return re.sub(
        '(_+)([.]_+)?',
        lambda m: f'%f{len(m.group(1))}.{len(m.group(2) or ".")-1}',
        line,
    )

lines = [replace(line) for line in lines_to_replace]

正则表达式的解释:

  • (_+)个匹配one or more个下划线;()部分将其作为capture group(第一个这样的组,即m.group(1))提供.
  • ([.]_+)? optionally匹配一个点,后跟一个或多个尾随下划线(尾随的?表示optional);点是character class([])的一部分,因为否则它将具有特殊含义"any character".()使该部件作为第二捕获组(m.group(2))可用.

Python相关问答推荐

如何避免Chained when/then分配中的Mypy不兼容类型警告?

Python中的嵌套Ruby哈希

使用miniconda创建环境的问题

如何在虚拟Python环境中运行Python程序?

log 1 p numpy的意外行为

Python虚拟环境的轻量级使用

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

不能使用Gekko方程'

如何从需要点击/切换的网页中提取表格?

如何在Python中使用Pandas将R s Tukey s HSD表转换为相关矩阵''

如果包含特定值,则筛选Groupby

根据Pandas中带条件的两个列的值创建新列

如何反转一个框架中列的值?

如何重新组织我的Pandas DataFrame,使列名成为列值?

高效生成累积式三角矩阵

文本溢出了Kivy的视区

Matplotlib中的曲线箭头样式

在一个数据帧中,我如何才能发现每个行号是否出现在一列列表中?

函数()参数';代码';必须是代码而不是字符串

Numpy`astype(Int)`给出`np.int64`而不是`int`-怎么办?