gpt4 book ai didi

python - 返回不在括号内的字符串的索引

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:01 24 4
gpt4 key购买 nike

假设我有一个字符串:

x = '[1.3].[1.2]'

如何找到 "." 的第一个索引那不在方括号内 ([])

所以对于上面的例子,第一个 "."在索引 5 处,它不在索引 2 处,因为在索引 2 处 "."在方括号内。

我试过做 x.index(".")但这只返回第一个 "." 的索引那"."可以在括号内。

我也试过做 x.index('].[') + 1但是这个例子会失败:

x = '[[1.3].[9.10]].[1.2.[4.[5.6]]]'
x.index('].[') + 1
6

自第一个"."不在括号内的是索引 13

如果有人能帮我解决这个问题,我将不胜感激。

这只是你有两个以 '[' 开头并以 ']' 结尾的字符串,你用 '.' 连接它们,所以

s1 = "[1.2]"
s2 = "[2.3]"

s1 + "." + s2

基本上我正在尝试获取“.”的索引连接字符串后。

最佳答案

一个简单的“解析器”:

def findRootIndexes (s):
nested = 0
for i, c in enumerate(s):
if c == '[':
nested += 1
elif c == ']':
nested -= 1
elif c == '.' and nested == 0:
yield i
>>> list(findRootIndexes('[1.3].[1.2]'))
[5]
>>> list(findRootIndexes('[[1.3].[9.10]].[1.2.[4.[5.6]]]'))
[14]
>>> list(findRootIndexes('[1.2].[3.4].[5.6]'))
[5, 11]

这本质上是一个 pushdown automaton除了我们不需要跟踪不同的标记,而只需要跟踪左括号和右括号。所以我们只需要计算我们还有多少个开放级别。


如果你想更进一步,你可以——正如 roippi 在评论中建议的那样——添加一些语法检查以防止像 [[1.2]]] 这样的事情发生。或者,您还可以添加一些额外的检查,以确保开头的 [ 始终以点或另一个开头的 [ 开头。为此,您可以使它成为一个后视解析器。像这样:

nested = 0
last = None
for i, c in enumerate(s):
if c == '[':
if last not in (None, '[', '.'):
raise SyntaxError('Opening bracket must follow either `[` or `.`')
nested += 1
elif c == ']'
if nested == 0:
raise SyntaxError('Closing bracket for non-open group')
nested -= 1
elif c == '.' and nested == 0:
yield i
last = c

当然,如果您从您知道有效的组件中自行创建该字符串,则实际上没有必要进行此类检查。

关于python - 返回不在括号内的字符串的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22441541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com