阿小信大人的头像
Life is short (You need Python) Bruce Eckel

用pyPEG构造自己的语法词法分析器2014-09-03 03:21

项目中遇到一个问题,需要导入一批具有特定格式的文本,由于认为修改或者程序原因文本语法格式可能会出错,出错就会导致导入后显示在页面上会无法正常显示,我需要的正确语法是一行文本中有类似{{ENKEY:WORD}}格式的被标注了的文字,ENKEY必须在指定的单词列表中,由于可能导致括号不匹配,遗漏字符,ENKEY拼写错误等等乱七八糟的错误可能,所以需要按[未被标注的字符]*[[标注的字符][未被标注的字符]*]*[未被标注的字符]*的规则构建一个词法分析器。

参考文档首页:http://fdik.org/pyPEG/ 很简单,代码如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from __future__ import unicode_literals
from settings import *
from pypeg2 import Symbol, parse, maybe_some
import re
__author__ = 'ashin'

EN_KEY = '|'.join([k for k in mark_choices.keys()])


class RawWord(Symbol):
    regex = re.compile(r'[^{}]*')


class MarkedWord(Symbol):
    regex = re.compile(r'\{\{(?:' + EN_KEY + r'):[^{}]+?\}\}[^{}]*')


class MarkedTextGrammar(str):
    grammar = RawWord, maybe_some(MarkedWord), RawWord


def text_is_ok(infos):
    try:
        return parse(infos['text'], MarkedTextGrammar)
    except:
        print "[Ignore] %s, line %d" % (infos['filename'], infos['line'])
        return False

if __name__ == '__main__':
    s = {
        'text':
        u"{{product_name:千龙网北京}}{{time:1月21日}}报道(实习记者 {{person_name:小婧)由{{org_name:国家广电总局}}、{{org_name:北京市人民政府}}主办,{{org_name:国家广电总局电影局}}、{{org_name:北京市广播电影电视局}}承办的第三届{{location:北京}}国际电影节将于{{time:4月16日至23日}}举行。",
        'line': 1,
        'filename': 'self'
    }
    print text_is_ok(s)

小婧后面缺少}},会被检查出错误。

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Python#  
分享到:
阅读[1049] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

发表评论