可爱的 Python: 使用 Spark 模块解析
2007-03-29 12:07:02 来源:WEB开发网清单 2. 智能 ASCII 样本文本(p.txt)Text with *bold*, and -itals phrase-, and [module]--this
should be a good 'practice run'.
除了样本文件中的内容,还有另外一点内容是关于格式的,但不是很多(尽管 的确有一些细微之处是关于标记与标点如何交互的)。
生成记号
我们的 Spark“智能 ASCII”解析器需要做的第一件事就是将输入文本分成相关的部件。在记号赋予这一层,我们还不想讨论如何构造记号,让它们维持原样就可以了。稍后我们会将记号序列组合成解析树。
上面的 typographify.def 中所示的语法提供了 Spark 词法分析程序/扫描程序的设计指南。请注意,我们只能使用那些在扫描程序阶段为“原语”的名称。也就是说,那些包括其它已命名的模式的(复合)模式在解析阶段必须被延迟。除了这样,我们其实还可以直接复制旧的语法。
清单 3. 删节后的 wordscanner.py Spark 脚本 class WordScanner(GenericScanner):
"Tokenize words, punctuation and markup"
def tokenize(self, input):
self.rv = []
GenericScanner.tokenize(self, input)
return self.rv
def t_whitespace(self, s):
r" [
]+ "
self.rv.append(Token('whitespace', ' '))
def t_alphanums(self, s):
r" [a-zA-Z0-9]+ "
print "{word}",
self.rv.append(Token('alphanums', s))
def t_safepunct(self, s): ...
def t_bracket(self, s): ...
def t_asterisk(self, s): ...
def t_underscore(self, s): ...
def t_apostrophe(self, s): ...
def t_dash(self, s): ...
class WordPlusScanner(WordScanner):
"Enhance word/markup tokenization"
def t_contraction(self, s):
r" (?<=[a-zA-Z])'(am|clock|d|ll|m|re|s|t|ve) "
self.rv.append(Token('contraction', s))
def t_mdash(self, s):
r' -- '
self.rv.append(Token('mdash', s))
def t_wordpunct(self, s): ...
更多精彩
赞助商链接