为什么PLY对待正则表达式与Python / re不同?
一些背景:
我正在编写一个解析器来从使用标记语言的站点检索信息.标准库作为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的文档. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |