Нет ничего похожего на StringScanner Руби в Python. Конечно, легко что-то собрать:
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.