【发布时间】:2009-11-17 21:31:08
【问题描述】:
是否有与 ruby 的 StringScanner class 等效的 python 类?我可以一起破解一些东西,但如果它已经存在,我不想重新发明轮子。
【问题讨论】:
是否有与 ruby 的 StringScanner class 等效的 python 类?我可以一起破解一些东西,但如果它已经存在,我不想重新发明轮子。
【问题讨论】:
有趣的是,Scanner 模块中有一个未记录的 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
以及交互式使用它的示例
>>> 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 之类的东西。
【讨论】:
看起来像是 re.split( pattern, string ) 的变体。
【讨论】:
https://pypi.python.org/pypi/scanner/
似乎是一个更易于维护且功能完整的解决方案。但它直接使用oniguruma。
【讨论】:
也许看看内置模块tokenize。看起来您可以使用 StringIO module 将字符串传递给它。
【讨论】:
今天有一个 Mark Watkinson 用 Python 实现 StringScanner 的项目:
http://asgaard.co.uk/p/Python-StringScanner
【讨论】:
您在寻找 Python 中的正则表达式吗?从官方文档中查看此链接:
【讨论】: