为什么PLY对待正则表达式与Python / re不同?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么PLY对待正则表达式与Python / re不同?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2595字,纯文字阅读大概需要4分钟。
内容图文
一些背景:
我正在编写一个解析器来从使用标记语言的站点检索信息.标准库作为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的文档.
内容总结
以上是互联网集市为您收集整理的为什么PLY对待正则表达式与Python / re不同?全部内容,希望文章能够帮你解决为什么PLY对待正则表达式与Python / re不同?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。