加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:48:50 所属栏目:百科 来源:网络整理
导读:一些背景: 我正在编写一个解析器来从使用标记语言的站点检索信息.标准库作为wikitools,…对我来说不起作用,因为我需要更具体,并根据我的需要调整它们,这使我和问题之间存在一层复杂性. Python“简单”的正则表达式使我很难以透明的方式识别标记语言中不同“
一些背景:

我正在编写一个解析器来从使用标记语言的站点检索信息.标准库作为wikitools,…对我来说不起作用,因为我需要更具体,并根据我的需要调整它们,这使我和问题之间存在一层复杂性. Python“简单”的正则表达式使我很难以透明的方式识别标记语言中不同“标记”之间的依赖关系 – 所以显然我需要在此旅程结束时到达PLY.

现在看来PLY通过正则表达式识别令牌与Python相比有所不同 – 但我找不到它的东西.我不想继续前进,以防我不明白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 —如果它与“搜索”相当(并且在与“匹配”相当的情况下没有任何内容).显然这很重要,因为那时 – 无法区分—(或=== from ===),即标题,编号,……无法区分.

那么为什么PLY对标准Python /正则表达式的行为有所不同? (以及如何? – 无法在文档中找到某些内容,或者在stackoverflow中找不到内容).

我猜这是我对PLY的理解,因为这个工具已经存在很长一段时间了,也就是说这种行为是我猜的意思.我能找到的唯一相关信息与different groups有关,但没有解释识别正则表达式本身的不同行为.我也没有在ply-hack中找到任何东西.

我忽略了一些愚蠢的简单吗?

为了比较,这里标准Python /正则表达式:

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标志.这意味着重新引擎会忽略regexp中的空白字符.所以r’ – .* – ‘实际上意味着r’ – .* – ‘,它确实完全匹配像’ – foobar —‘这样的字符串.有关更多详细信息,请参阅re.VERBOSE的文档.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读