Python相当于ruby的StringScanner?
是否有一个等同于ruby的StringScanner类的python类 ? 我可以一起破解某些东西,但如果已经存在,我不想重新发明轮子。
看起来像re.split( pattern, string )
的变体。
有趣的是, 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")
在讨论之后,它看起来像是作为实验代码/其他人的起点。
没有什么能像Ruby中的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 >>>
但是,对于我所做的工作,我倾向于一次性编写这些正则表达式并使用组来提取所需的字段。 或者对于更复杂的东西,我会写一个一次性的tokenizer或者看看PyParsing或PLY为我标记。 我不认为自己使用像StringScanner这样的东西。
https://pypi.python.org/pypi/scanner/
似乎是一个更加维护和function完整的解决方案。 但它直接使用oniguruma。
你在Python中寻找正则表达式吗? 从官方文档中查看此链接:
今天有一个Mark Watkinson的项目在Python中实现了StringScanner:
http://asgaard.co.uk/p/Python-StringScanner
也许看看内置模块tokenize 。 看起来您可以使用StringIO模块将字符串传递给它。