Python эквивалент StringScanner Рубина? - PullRequest
2 голосов
/ 18 ноября 2009

Есть ли класс Python, эквивалентный классу Ruby ? Я мог бы взломать что-нибудь вместе, но я не хочу изобретать велосипед, если он уже существует.

Ответы [ 7 ]

10 голосов
/ 18 ноября 2009

Интересно, что в модуле 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")

После обсуждения похоже, что он был оставлен в качестве экспериментального кода / отправной точки для других.

4 голосов
/ 18 ноября 2009

Нет ничего похожего на 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.

1 голос
/ 26 января 2014

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

Кажется, более поддерживаемое и функциональное решение. Но он использует oniguruma напрямую.

1 голос
/ 18 ноября 2009

Похоже на вариант re.split( pattern, string ).

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

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

0 голосов
/ 13 октября 2011

Сегодня существует проект Марка Уоткинсона, который реализует StringScanner в Python:

http://asgaard.co.uk/p/Python-StringScanner

https://github.com/markwatkinson/python-string-scanner

http://code.google.com/p/python-string-scanner/

0 голосов
/ 18 ноября 2009

Возможно загляните во встроенный модуль tokenize . Похоже, что вы можете передать строку, используя модуль StringIO .

0 голосов
/ 18 ноября 2009

Вы ищете регулярные выражения в Python?Проверьте эту ссылку из официальных документов:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...