python - 为什么 PLY 对待正则表达式与 Python/re 不同?

标签 python regex ply

一些背景:

我正在编写一个解析器来从带有标记语言的站点中检索信息。作为 wikitools 的标准库,...对我不起作用,因为我需要更具体,并使它们适应我的需求,这在我和问题之间增加了一层复杂性。 Python +“简单”正则表达式让我难以以透明的方式识别标记语言中不同“标记”之间的依赖关系 - 所以很明显我需要在这次旅程的最后到达 PLY。

现在看来,与 Python 相比,PLY 通过正则表达式识别 token 的方式有所不同 - 但我在上面找不到任何东西。我不想继续,以防我不明白 PLY 如何确定其词法分析器中的标记(否则我将无法控制我所依赖的逻辑并且将在稍后阶段失败)。

开始了:

import ply.lex as lex

text = r'--- 123456 ---'
token1 = r'-- .* --'
tokens = (
   'TEST',
)
t_TEST = token1

lexer = lex.lex(reflags=re.UNICODE, debug=1)
lexer.input(text)
for tok in lexer:
    print tok.type, tok.value, tok.lineno, tok.lexpos

结果是:
lex: tokens   = ('TEST',)
lex: literals = ''
lex: states   = {'INITIAL': 'inclusive'}
lex: Adding rule t_TEST -> '-- .* --' (state 'INITIAL')
lex: ==== MASTER REGEXS FOLLOW ====
lex: state 'INITIAL' : regex[0] = '(?P<t_TEST>-- .* --)'
TEST --- 123456 --- 1 0

最后一行令人惊讶 - 我原以为第一个和最后一个 - 会在 --- 123456 --- 中丢失,以防它与“搜索”相媲美(并且没有与“匹配”相媲美的情况)。显然这很重要,因为 -- 无法与 --- (或 === 来自 === )区分开来,即标题、enumbering ……无法区分。

那么为什么 PLY 对标准 Python/regex 的行为有所不同? (以及如何? - 在文档中或在 stackoverflow 中找不到某些内容)。

我猜这更多是我对 PLY 的理解,因为该工具已经存在了很长一段时间,即我猜想这种行为是有意为之。我能找到的唯一与 different groups 相关的信息并没有解释识别正则表达式本身的不同行为。我在 ply-hack 中也没有发现任何东西。

我是否忽略了一些愚蠢而简单的事情?

出于比较目的,这里使用标准 Python/regex:
import re

text = r'--- 123456 ---'
token1 = r'-- .* --'

p = re.compile(token1)

m = p.search(text)
if m:
    print 'Match found: ', m.group()
else:
    print 'No match'

m = p.match(text)
if m:
    print 'Match found: ', m.group()
else:
    print 'No match'

给出:
Match found:  -- 123456 --
No match

(正如预期的那样,第一个是“搜索”的结果,第二个是“匹配”的结果)

我的设置:我正在使用 spyder - 这是开始时的终端显示:
Python 2.7.5+ (default, Sep 19 2013, 13:49:51) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Imported NumPy 1.7.1, SciPy 0.12.0, Matplotlib 1.2.1
Type "scientific" for more details.

感谢您的时间和帮助。

最佳答案

答案在ply lexmatch regular expression has different groups than a usual re这里也有帮助。在 lex.py 中:

c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags)

请注意 VERBOSE旗帜。这意味着 re引擎会忽略正则表达式中的空白字符。所以r'-- .* --'真正的意思是r'--.*--' ,它确实完全匹配像 '--- foobar ---' 这样的字符串.参见 re.VERBOSE 的文档更多细节。

关于python - 为什么 PLY 对待正则表达式与 Python/re 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21961206/

相关文章:

python - 在 python 中,如何运行一个在我向其发送 Ctrl+D 之前不返回的命令行程序

python - 当存在多个大括号时,如何使用正则表达式获取完全匹配的短语

python - DJANGO 将字段中的模型类型保存为通用外键

ruby 正则表达式

javascript - 如何使用此正则表达式接受数量文本字段的负值

Python 解析器 ply 匹配错误的正则表达式

python - PLY:快速解析长长的项目列表?

python - 如何从 python PLY 中的方案解释 "do"循环

python - 如何使用selenium python抓取多级下拉列表[依赖选择]

php - PHP 代码库中令人困惑的正则表达式