在Perl或Python中模拟类似lex的功能
问题内容:
这是交易。有没有办法在基于多个正则表达式的行中标记字符串?
一个例子:
我必须获取所有href标记,其对应的文本以及基于不同正则表达式的一些其他文本。所以我有3个表达式,想对行进行标记并提取与每个表达式匹配的文本的标记。
实际上,我是使用flex(不要与Adobe混淆)完成此操作的,它是很好的旧lex的实现。lex通过执行基于表达式的“操作”提供了一种优雅的方法。一个人也可以控制lex读取文件的方式(基于块/行的读取)。
问题是flex实际上会产生实际上执行标记化工作的C / C ++代码。我有一个包含所有这些内容的make文件。我想知道perl /
python是否可以某种方式做同样的事情。只是我想用一种编程语言自己做所有我想做的事情。
标记化只是我作为应用程序的一部分要做的事情之一。
除了perl或python外,任何语言(也可以起作用)都可以吗?
我确实在这里阅读了有关PLY和ANTLR的信息(解析,在哪里可以了解到它)。
但是有没有办法在python本身中自然地做到这一点?请原谅我的无知,但是这些工具是否在任何流行的产品/服务中使用?
谢谢。
问题答案:
如果您是专门从网页中解析链接之后的,那么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。
祝一切顺利,
保罗