Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到字符串中未转换的单花括号的索引位置? a=“a” sample_string=“asdf{{{a}}{{{{a}{{a}}” ##需要找到这些括号^^^ 打印(示例字符串格式(a=a))_Python_String - Fatal编程技术网

Python 如何找到字符串中未转换的单花括号的索引位置? a=“a” sample_string=“asdf{{{a}}{{{{a}{{a}}” ##需要找到这些括号^^^ 打印(示例字符串格式(a=a))

Python 如何找到字符串中未转换的单花括号的索引位置? a=“a” sample_string=“asdf{{{a}}{{{{a}{{a}}” ##需要找到这些括号^^^ 打印(示例字符串格式(a=a)),python,string,Python,String,上面的绳子将升起 ValueError: unexpected '{' in field name 我希望能够避开_string.formatter_解析器阻塞的大括号。我开始寻找所有不匹配的对,但意识到这不适用于双转义大括号。我意识到我不知道如何解决这个问题 ##这并不能解决问题。 def find_不匹配: 指数=[] 堆栈=[] indexstack=[] 对于枚举中的i,e: 如果e==“{”: stack.append(e) indexstack.append(i) elif e==

上面的绳子将升起

ValueError: unexpected '{' in field name
我希望能够避开_string.formatter_解析器阻塞的大括号。我开始寻找所有不匹配的对,但意识到这不适用于双转义大括号。我意识到我不知道如何解决这个问题

##这并不能解决问题。
def find_不匹配:
指数=[]
堆栈=[]
indexstack=[]
对于枚举中的i,e:
如果e==“{”:
stack.append(e)
indexstack.append(i)
elif e==“}”:
如果len(堆栈)<1:
索引.附加(i)
其他:
stack.pop()
indexstack.pop()
而len(indexstack)>0:
index.append(indexstack.pop())
回报指数
我知道我不能只寻找单个牙套,而不看它们是否也配对。我不能只寻找配对,然后再看它们是否逃脱。但有一些情况让我感觉像这样:

s1=f“asdf{{{{{a}}}{{{{{{{a}}}{{a}}}”
s2=“asdf{{{{{a}}}{{{{{{{a}}}}{{a}}}”
打印(s1)
打印(s2.格式(a=a))
s1打印,s2不打印

asdf {a} { { {a} {'a'}
ValueError: unexpected '{' in field name
如何找到字符串中未替换大括号的索引位置?


其他信息:

有人问我到底在做什么。现实世界中的情况实际上有点尴尬。正在记录的字符串用ansi颜色代码包装,以使屏幕上的日志着色,从而帮助区分日志行的来源。 同一行也正在写入不包含ansi代码的日志文件。为此,将向日志格式化程序执行format()操作的行中添加字符串格式化程序大括号条目,并用ansi颜色代码或空字符串替换大括号。
例如:

“{color.grey}日志项,{可能在字符串{color.reset}中包含大括号}”
替换颜色项的逻辑是使用部分格式设置程序完成的,其中它尝试逐项列出字符串中的所有字段,只替换传入的字典中存在的字段。除了单例花括号外,它执行此操作

def partialformat(s:str,recursionlimit:int=10,**kwargs):
"""
vformat完成格式化字符串的实际工作。\u vformat是
对vformat的内部调用,并能够更改递归
要处理的嵌入式花括号数量的限制。但出于某些原因
vformat不会。vformat还将限制设置为2!
_vformat'args'的第二个参数允许我们传入一个字符串
包含空的大括号集并忽略它们。
"""
类格式占位符(对象):
def uuu init uuuu(self,key):
self.key=key
定义格式(自身、规范):
结果=self.key
如果规格:
结果+=“:”+规格
返回“{”+结果+“}”
定义获取项目(自身,项目):
返回
类格式dict(dict):
def________;缺失(自身,钥匙):
返回格式占位符(键)
类PartialFormatter(string.Formatter):
def get_字段(自身、字段名称、参数、kwargs):
尝试:
obj,first=super(PartialFormatter,self).get_字段(字段名称,args,kwargs)
除了(索引器错误、键错误、属性错误):
首先,rest=formatter\u field\u name\u split(field\u name)
obj='{'+field_name+'}'
#循环遍历字段名称的其余部分,执行以下操作
#根据需要设置getattr或getitem
对于is_attr,我在休息:
如果是_attr:
尝试:
obj=getattr(obj,i)
除属性错误作为exc外:
通过
其他:
obj=obj[i]
首先返回obj
fmttr=部分格式()
尝试:
fs,u=fmttr.vformat(s,(“{}”),FormatDict(**kwargs),set(),recursionlimit)
除了作为exc的ValueError:
#如果我们想要自动摆脱无可匹敌的大括号,它应该在这里。
加薪
除作为exc的例外情况外:
加薪
返回fs
用法:

class颜色:
灰色='\033[90米'
重置='\033[0m'
colorobj=Color()
尝试:
s=部分格式(s,**{“颜色”:colorobj})
除了作为exc的ValueError:
通过
产出:

"Log entry which {might contain curly} braces in the string"


附加编辑:

我面临的问题是,当字符串包含单个花括号时,我无法对该字符串调用
partialformat
,因为它会引发
ValueError异常“格式字符串中遇到单个”
。这会导致无法对日志行着色

s=“{trco.grey}失败{trco.r}消息{blah blah blah”
我想,如果我能检测到单件花括号在字符串中的位置,我可能会自动跳出它们。事实证明,这比我预想的要困难得多

又一次编辑:

我认为这是事件顺序的问题

  • 原始字符串
    s=“带{单个大括号的文本”
  • Colorizer函数添加了一些基本的花括号文本,这些文本将在以后被替换:
    “{color.red}文本与{single curly brace{color.reset}”文本
  • 在logging.Formatter.doFormat()期间,用ansi颜色代码替换
    {color.red}
  • 试试这个:

    string = "abcd {{a}} {{{{a}{{a}}"
    indices = []
    for i, e in enumerate(string):
        if e == '{':
            indices.append(i)
        elif e == '}':
            indices.pop()
    print(indices)
    
    这将打印:
    [11,12,13]
    ,这是索引

    我所做的是迭代字母,只计算打开的大括号,
    string = "abcd {{a}} {{{{a}{{a}}"
    indices = []
    for i, e in enumerate(string):
        if e == '{':
            indices.append(i)
        elif e == '}':
            indices.pop()
    print(indices)
    
    "{{a}}{b}}"
         ^
    
    "{{a}}{b}}"
             ^