当前位置:  开发笔记 > 编程语言 > 正文

像Perl或Python中的lex一样模拟功能

如何解决《像Perl或Python中的lex一样模拟功能》经验,为你挑选了3个好方法。

这是交易.有没有办法让基于多个正则表达式的行中的字符串标记?

一个例子:

我必须根据不同的正则表达式获取所有href标签,相应的文本和其他一些文本.所以我有3个表达式,并且想要对行进行标记并提取与每个表达式匹配的文本标记.

我实际上是使用flex完成的(不要与Adobe混淆),这是一个很好的老lex的实现.lex通过基于表达式执行"actions"来提供一种优雅的方法.人们也可以控制lex读取文件的方式(基于块/行的读取).

问题是flex实际上产生的C/C++代码实际上是标记化工作.我有一个包含所有这些东西的make文件.我想知道perl/python是否能以某种方式做同样的事情.它只是我想用一种编程语言本身做我喜欢的一切.

令牌化只是我想要在我的应用程序中执行的操作之一.

除了perl或python之外,任何语言(功能也可以)都可以这样做吗?

我在这里读过关于PLY和ANTLR的内容(解析,我在哪里可以了解它).

但有没有办法在python本身自然地做到这一点?请原谅我的无知,但这些工具是否适用于任何受欢迎的产品/服务?

谢谢.



1> slashmais..:

查看以下模块的文档 CPAN

HTML :: TreeBuilder作为

HTML :: TableExtract

解析:: RecDescent的

我已经使用这些模块来处理相当大而复杂的网页.



2> pjf..:

如果您专门解析网页中的链接,那么Perl的WWW :: Mechanize模块将以非常优雅的方式为您解决问题.这是一个示例程序,它抓取Stack Overflow的第一页并解析所有链接,打印其文本和相应的URL:

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new;

$mech->get("http://stackoverflow.com/");

$mech->success or die "Oh no! Couldn't fetch stackoverflow.com";

foreach my $link ($mech->links) {
    print "* [",$link->text, "] points to ", $link->url, "\n";
}

在主循环中,每个$link都是WWW :: Mechanize :: Link对象,因此您不仅限于获取文本和URL.

祝一切顺利,

保罗



3> Jerub..:

听起来你真的只想解析HTML,我建议你看看这些精彩的软件包:

BeautifulSoup

lxml.html

html5lib

要么!您可以使用类似以下之一的解析器:

PyParsing

DParser - 具有良好python绑定的GLR解析器.

ANTLR - 一个递归的解析器生成器,可以生成python代码.

这个例子来自BeautifulSoup 文档:

from BeautifulSoup import BeautifulSoup, SoupStrainer
import re

links = SoupStrainer('a')
[tag for tag in BeautifulSoup(doc, parseOnlyThese=links)]
# [success, 
#  experiments, 
#  BoogaBooga]

linksToBob = SoupStrainer('a', href=re.compile('bob.com/'))
[tag for tag in BeautifulSoup(doc, parseOnlyThese=linksToBob)]
# [success, 
#  experiments]

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有