通过使用列表指定要插入的值,是否可以基于相同的匹配模式在字符串中插入不同的值?我正在使用python 3和re.附属的.

以下是a的意思:

line = "Float: __, string: __"
values = ["float", "string"]

newLine = re.sub('(_+)([.]_+)?',
    (lambda m:
    f'%'
    f'{len(m.group(1))}'
    f'{"." if values == "float" else ""}'
    f'{(len(m.group(2) or ".")-1) if values == "float" else ""}'
    f'{"f" if values == "float" else "s"}'),
    line)

print(newLine)                                                

预期结果:

Float: %2.0f, string: %2s

实际结果:

Float: %2s, string: %2s

是否可以循环遍历值列表以获得正确的结果(这不起作用,我得到了一个TypeError)?类似于:

newLine = re.sub('(_+)([.]_+)?',
    ((lambda m:
    f'%'
    f'{len(m.group(1))}'
    f'{"." if v == "float" else ""}'
    f'{(len(m.group(2) or ".")-1) if v == "float" else ""}'
    f'{"f" if v == "float" else "s"}') for v in values),
    line)

Edit 1

推荐答案

repl参数内不能像这样循环,但可以定义计数器并将其传递给repl函数:

import re

line = "Float: __, string: __"
values = ["float", "string"]
obj = lambda:None
obj.i = -1

def repl(m, count, values):
    count.i += 1
    return f'%{len(m.group(1))}{"." if values[count.i] == "float" else ""}{(len(m.group(2) or ".")-1) if values[count.i] == "float" else ""}{"f" if values[count.i] == "float" else "s"}'

newLine = re.sub(r'(_+)(\._+)?',
    lambda m: repl(m, obj, values),
    line)

print(newLine)      
## => Float: %2.0f, string: %2s

请参见Python demo.

这里,声明一个obj对象,并用-1初始化其i属性.然后,在repl函数内,其值递增并用作values列表的索引.

请注意,只有当匹配数等于values列表中的项目数时,此方法才有效.

Python-3.x相关问答推荐

TypeError:&Quot;Value&Quot;参数必须是标量、Dict或Series,但您传递了&Quot;Index&Quot;

文件名中的文件打开和撇号

如何强调您正在寻求以 pandas 数据帧的另一列为条件的差异?

如何在当前测试中使用fixture 转换后的数据进行参数化?

如何将日期时间索引写入日期类型的表?

在python中将字符串写入文本文件

以编程方式映射 uniprot ID 时如何解决 400 客户端错误?

为什么 f-strings 比 str() 更快地解析值?

使用带有多线程的 win32com

Python从base64转换为二进制

如何判断一个字符串是否包含有效的 Python 代码

如何使 Python3 成为 Geany 中的默认 Python

如何编写可 Select 充当常规函数的 asyncio 协程?

用于 Django 应用程序的 Cython:它会工作吗?

在没有时间的python中创建日期

在 Alembic 迁移期间更新列内容

pdfminer python 3.5

如何强制 Sphinx 使用 Python 3.x 解释器

如何为 Python 3.x 安装 psycopg2?

在 Visual Studio Code 中调试 Scrapy 项目