Python等价于ruby的StringScanner?

2024-10-01 15:40:53 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一个python类等价于ruby的StringScanner class?我可以把一些东西组合起来,但如果这已经存在,我不想重新发明轮子。在


Tags: 轮子classruby等价stringscanner
3条回答

看起来像是re.split( pattern, string )上的变体。在

http://docs.python.org/library/re.html

http://docs.python.org/library/re.html#re.split

有趣的是,re模块中有一个未记录的Scanner类:

import re

def s_ident(scanner, token): return token
def s_operator(scanner, token): return "op%s" % token
def s_float(scanner, token): return float(token)
def s_int(scanner, token): return int(token)

scanner = re.Scanner([
    (r"[a-zA-Z_]\w*", s_ident),
    (r"\d+\.\d*", s_float),
    (r"\d+", s_int),
    (r"=|\+|-|\*|/", s_operator),
    (r"\s+", None),
    ])

print scanner.scan("sum = 3*foo + 312.50 + bar")

discussion之后,它看起来像是留作实验代码/其他人的起点。在

在Python中,没有什么东西能与Ruby的StringScanner完全一样。当然,把一些东西组合起来是很容易的:

import re

class Scanner(object):
    def __init__(self, s):
        self.s = s
        self.offset = 0
    def eos(self):
        return self.offset == len(self.s)
    def scan(self, pattern, flags=0):
        if isinstance(pattern, basestring):
            pattern = re.compile(pattern, flags)
        match = pattern.match(self.s, self.offset)
        if match is not None:
            self.offset = match.end()
            return match.group(0)
        return None

以及一个交互式使用它的例子

^{pr2}$

但是,对于我所做的工作,我倾向于一次性编写这些正则表达式,并使用组来提取所需的字段。或者对于更复杂的东西,我会编写一个一次性的标记器,或者使用PyParsing或PLY为我标记化。我不觉得自己在用StringScanner之类的东西。在

相关问题 更多 >

    热门问题