首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将格式化程序特性扩展到f-string语法。

将格式化程序特性扩展到f-string语法。
EN

Stack Overflow用户
提问于 2022-05-31 11:43:36
回答 3查看 111关注 0票数 1

在我的一个项目中,我将字符串传递给使用格式说明语格式化它的格式化程序子类。在我的例子中,它是自定义的(使用格式化程序类的特性),方法是添加额外的bang转换器:!u将产生的字符串转换为小写,!c转换为titlecase,!q使任何方括号(因为原因)加倍,等等。

例如,使用a = "toFu""{a!c}"变成"Tofu"

如何使我的系统使用f-string 语法,以便将"{a+a!c}"转换为"Tofutofu"

注意:我不是想要一种使f"{a+a!c}" (注意到f的存在)解析为"Tofutofu"的方法,这是钩入内置python f-string格式机器所涵盖的,我是在问是否有一种方法可以让函数或任何形式的python代码将"{a+a!c}" (注意到没有f)转换为"Tofutofu"

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-01 01:10:37

从@Tomerikoo的救生答案演变而来,代码如下:

代码语言:javascript
运行
复制
import re

def formatter(s):
    def replacement(match):
        pre, bangs, suf = match.group(1, 2, 3)
        # pre : the part before the first bang
        # bangs : the bang (if any) and the characters going with it
        # suf : the colon (if any) and the characters going with it

        if not bangs:
            return eval("f\"{" + pre + suf + "}\"")

        conversion = set(bangs[1:]) # the first character is always a bang
        sra = conversion - set("tiqulc")
        conversion = conversion - sra
        if sra:
            sra = "!" + "".join(sra)

        value = eval("f\"{" + pre + (sra or "") + suf + "}\"")

        if "q" in conversion:
            value = value.replace("{", "{{")

        if "u" in conversion:
            value = value.upper()

        if "l" in conversion:
            value = value.lower()

        if "c" in conversion and value:
            value = value.capitalize()

        return value

    return re.sub(r"{([^!:\n]+)((?:![^!:\n]+)?)((?::[^!:\n]+)?)}", replacement, s)

我在上面评论的三个组的结果都是巨大的。

注意:它仍然使用eval (无论如何都不能接受),它不允许多行替换字段,它可能会导致问题和/或差异,在!:之间放置空格。但这对我来说是可以接受的。

票数 0
EN

Stack Overflow用户

发布于 2022-05-31 15:49:38

不确定我仍然完全理解您需要什么,但是从问题和一些注释中给出的详细信息来看,下面是一个函数,它以您指定的格式解析字符串,并给出所需的结果:

代码语言:javascript
运行
复制
import re

def formatter(s):
    def replacement(match):
        expr, frmt = match[1].split('!')
        if frmt == 'c':
            return eval(expr).title()

    return re.sub(r"{([^{]+)}", replacement, s)

a = "toFu"
print(formatter("blah {a!c}"))
print(formatter("{a+a!c}blah"))

产出:

代码语言:javascript
运行
复制
blah Tofu
Tofutofublah

这使用了repl函数的re.sub参数的函数变体。这个函数(replacement)可以进一步扩展,以支持所有其他!x

主要缺点:

  • 使用eval是邪恶的。
  • 这不接受计数常规格式说明符,即:0.3

也许有人能从这里得到改善。

票数 1
EN

Stack Overflow用户

发布于 2022-05-31 11:54:48

请检查只允许指定的字符:'s‘、'r’或'a‘

https://peps.python.org/pep-0498/

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72447176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档