我想在字符串中找到满足一定条件的字母的索引。如果字母前的所有括号都完整,我想找到字母g的索引。
这是我的
sen = 'abcd(fgji(l)jkpg((jgsdti))khgy)ghyig(a)gh'
这是我做的
lst = [(i.end()) for i in re.finditer('g', sen)]
# lst
# [7, 16, 20, 29, 32, 36, 40]
count_open = 0
count_close = 0
for i in lst:
sent=sen[0:i]
for w in sent:
if w == '(':
count_open += 1
if w == ')':
count_close += 1
if count_open == count_close && count_open != 0:
c = i-1
break
它给我的 c 为 39,这是最后一个索引,但是正确答案应该是 35,因为倒数第二个 g 完成之前的括号。
请您参考如下方法:
您可以省去 regex 并简单地使用一个堆栈来跟踪您的 parens 在迭代字符时是否平衡:
In [4]: def find_balanced_gs(sen):
...: stack = []
...: for i, c in enumerate(sen):
...: if c == "(":
...: stack.append(c)
...: elif c == ")":
...: stack.pop()
...: elif c == 'g':
...: if len(stack) == 0:
...: yield i
...:
In [5]: list(find_balanced_gs(sen))
Out[5]: [31, 35, 39]
这里使用堆栈是检查平衡 parans 的“经典”方法。我从头开始实现它已经有一段时间了,所以可能有一些我没有考虑过的边缘情况。但这应该是一个好的开始。我制作了一个生成器,但您可以将其设为返回索引列表、第一个此类索引或最后一个此类索引的普通函数。
