【问题标题】:Python equivalent of ruby's StringScanner?Python 相当于 ruby​​ 的 StringScanner?
【发布时间】:2009-11-17 21:31:08
【问题描述】:

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

【问题讨论】:

    标签: python ruby string


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在 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 之类的东西。

      【讨论】:

        【解决方案3】:

        看起来像是 re.split( pattern, string ) 的变体。

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              【讨论】:

                【解决方案7】:

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

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

                【讨论】:

                  猜你喜欢
                  • 2020-02-16
                  • 2019-07-04
                  • 2011-10-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-10-23
                  相关资源
                  最近更新 更多