【发布时间】:2012-07-19 08:27:18
【问题描述】:
用户键入一个包含正则表达式的字符串,如下所示:
'I have the string "(.*)"'
或
'when user enters (\d+) times text "(.*)" truncate spaces'
我需要将每个匹配括号的出现计数为用户类型,因此上面的文本将为第一个文本返回计数 1,为第二个文本返回 2。另一方面,不应该计算没有匹配的括号:
'I am in the middle of writing this ('
我还想避免计算嵌套括号。 由于此代码将在 vim 中的 每个 击键的某些情况下执行(它是 UltiSnips 的 sn-p 的一部分,因此当我创建 sn-p 并输入给定的占位符时,此计数函数应评估我在每个新字符上输入的内容)它需要快速;)
总结要求:
- 计算括号对
- 不要计算没有匹配的括号
- 不计算嵌套括号
- 计数快;)
根据要求 - 这是我完成这项工作的初步努力: https://gist.github.com/3142334
它有效,但不幸的是它也计算内括号,所以我需要对其进行更多调整。
这是另一种只计算外括号的解决方案:
def fb(string, c=0):
left_bracket = string.find("(")
if left_bracket > -1:
string = string[left_bracket + 1:]
right_bracket = string.find(")")
if right_bracket > -1:
if string[:right_bracket].find("(") == -1:
c += 1
string = string[right_bracket + 1:]
return fb(string, c)
else:
return c
【问题讨论】:
-
你能发布你目前的工作吗?
-
请在您的需求摘要中添加以下内容:
0: Show what I've thought of or done so far -
现在我只是在 ipython 控制台中进行实验。我认为这个必须递归才能以可维护的方式发现问题。
-
通常你会使用堆栈之类的东西来进行这种括号配对。在您的 vim 环境中,击键之间的状态是否保持不变,或者您是否需要(重新)处理每次击键时的整个字符串?
-
不幸的是,我每次都需要重新处理字符串:)
标签: python