Python 不使用迭代或正则表达式查找字符串的连续子字符串的结尾

Python 不使用迭代或正则表达式查找字符串的连续子字符串的结尾,python,parsing,Python,Parsing,我正在尝试编写一个迭代LL(k)解析器,并且我已经很好地记录了字符串,因为它们有一个开始和结束标记,所以您可以只使用“”。join(标记列表[string\u start:string\u end]) 但是,数字不是,而是由.0123456789组成。它们可以出现在程序中的任何给定点上,具有任意长度,并且完全由非数字分隔 一些例子,因为这个定义很模糊: 56 123.45/! is 56 and 123.45 followed by two other tokens 565.5345.

我正在尝试编写一个迭代LL(k)解析器,并且我已经很好地记录了字符串,因为它们有一个开始和结束标记,所以您可以只使用
“”。join(标记列表[string\u start:string\u end])

但是,数字不是,而是由
.0123456789
组成。它们可以出现在程序中的任何给定点上,具有任意长度,并且完全由非数字分隔

一些例子,因为这个定义很模糊:

56 123.45/!     is 56 and 123.45 followed by two other tokens

565.5345.345 %  is 565.5345, 0.345 and two other tokens (incl. whitespace)
我试图解决的问题是解析器应该如何找出数字文本的结尾。(请注意,这是一种上下文无关、自我修改的解释语法,因此不需要进行单独的词汇分析。)

我可以并且已经通过迭代解决了这个问题:

def _next_notinst(self, atindex, subs = DIGITS):
    """return the next index of a char not in subs"""
    for i, e in enumerate(self.toklist[atindex:]):
        if e not in subs:
            return i - len(self.toklist)
        else:
            break
    return self.idx.v
(我不认为我需要澄清这些变量,因为这是一个非常简单的例子。)

太好了!这是可行的,但至少有两个问题:

  • 对于一个数字长度为n的数字,它是O(n)。不理想*

  • 此方法所属的解析器类已经在使用
    while True:
    循环遍历字符串的任意部分,我不希望在不需要时使用远程嵌套循环

  • 来自上一个项目符号:由于解析器使用任意k lookahead和skipahead

我不想使用RegEx,主要是因为我不知道它,现在使用它会使我的代码对我,它的创建者来说不可理解

对于这个问题,必须有一个简单的,
*是的,我完全知道解析器本身是O(n),但是我们也不需要catenator的数量大于O(n)。如果你不相信我的话,字符串catenator是O(1),因为它只是在程序中查找下一个未替换的
,然后将所有字符合并到一起。我不能对数字做同样的事情吗?

由于缺乏测试,我的另一个答案实际上是错误的

我决定接受它,学习一点正则表达式,因为这是解决这个问题的唯一其他方法

适用于我想要的内容,并与以下内容相匹配:

123.43.453""

.234234!/%
但并非如此,例如:

"1233

数字可以出现在字符串分隔符中吗?@Daenyth它们可以出现,但是
双引号和另一个双引号之间没有\反斜杠的所有内容都是字符串。解析器会在运行时构建一个字符串范围表,因此它不会在字符串文本内跳转,并且字符串优先于数字。只有在解析器在字符串外找到数字文本时,才会调用处理数字的方法。