Python相当于ruby的StringScanner?

时间:2009-11-17 21:31:09

标签: python ruby string

是否有一个等同于ruby的StringScanner class的python类?我可以一起破解某些东西,但如果已经存在,我不想重新发明轮子。

7 个答案:

答案 0 :(得分:10)

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

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之后,它看起来像是作为实验代码/其他人的起点。

答案 1 :(得分:4)

在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

以及以交互方式使用它的示例

>>> s = Scanner("Hello there!")
>>> s.scan(r"\w+") 
'Hello'
>>> s.scan(r"\s+") 
' '
>>> s.scan(r"\w+")
'there'
>>> s.eos()
False
>>> s.scan(r".*")
'!'
>>> s.eos()
True
>>> 

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

https://pypi.python.org/pypi/scanner/

似乎是一个更加维护和功能完整的解决方案。但它直接使用oniguruma。

答案 4 :(得分:0)

你在Python中寻找正则表达式吗?从官方文档中查看此链接:

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

答案 5 :(得分:0)

也许查看内置模块tokenize。看起来您可以使用StringIO module将字符串传递给它。

答案 6 :(得分:0)