当前位置: 首页 > 面试题库 >

在Perl或Python中模拟类似lex的功能

谢俊悟
2023-03-14
问题内容

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

一个例子:

我必须获取所有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。

祝一切顺利,

保罗



 类似资料:
  • 但是如果我从ClassUnderTest运行methodUnderTest: 它抛出了一个ClassWithStatic的真实实例,该实例在其实例Method中失败。

  • 问题内容: 我正在通过编写一个小型个人项目来学习Go。即使很小,我还是决定从头开始进行严格的单元测试,以学习Go的良好习惯。 琐碎的单元测试都很好而且花哨的,但是我现在对依赖项感到困惑;我希望能够用模拟函数替换一些函数调用。这是我的代码片段: 我希望能够测试downloader()而不实际通过http获取页面- 即通过模拟get_page(更容易使用,因为它仅将页面内容作为字符串返回)或http.

  • 问题内容: 我在Python中使用模拟,并想知道这两种方法中哪一种更好(请参阅:更多pythonic)。 方法一 :只需创建一个模拟对象并使用它即可。代码如下: 方法二 :使用补丁创建一个模拟。代码如下: 两种方法都做同样的事情。我不确定这些差异。 谁能启发我? 问题答案: 与…是一个非常不同的生物。 用 模拟对象 替换 该类,并允许您使用模拟实例。看一下这个片段: 以允许您控制所调用函数中类的用

  • 问题内容: 我正在尝试使用python模拟模块的函数(返回一些外部内容)。 我在导入模块的模拟函数时遇到了一些麻烦。 例如,在我有 我想嘲笑,以便它返回其他内容。 我正在尝试: 如果在另一个模块中被调用,它实际上似乎永远不会返回模拟对象。我在使用方法方面缺少什么吗? 请注意,如果我调用以下内容,则一切正常: 但是,如果从另一个模块内部调用,它将调用原始函数而不是模拟版本: 内容 所以我想我的问题是

  • 问题内容: 我试过了 但这会引发语法错误。我也尝试过像这样修补 有什么办法吗? 问题答案: 是python 2.x中的关键字,将其用作属性会引发SyntaxError。您可以通过在文件开头使用来避免这种情况。 注意:您不能简单地使用,因为除非禁用该语句,否则不会调用您修改的print函数。 编辑:您还需要在每个要使用修改后功能的文件中使用它,否则它将被该语句掩盖。

  • 问题内容: 我在Python中使用时遇到了一些困难: 测试实际上返回正确的值,但它是Mock对象,不是。您如何在Python库中模拟属性? 问题答案: 您需要使用和: 这意味着:调用时,在该调用的返回值上,为属性设置a以返回value 。

  • 问题内容: 我正在尝试近两个小时,没有任何运气。 我有一个看起来像这样的模块: 稍后在代码中: 有任何想法吗? 编辑: 亚历克斯的建议似乎无效: 运行测试时: 但是,当我从python交互式控制台运行相同的代码时,它 确实 起作用。 更多编辑: 我正在使用一个测试文件,该文件具有特定于我模块这一部分的所有测试。首先,我导入可用的模块,以演示和测试常用用法。缺少软件包被认为是一种极端情况,因此我稍后

  • 问题内容: 如何在MySQL中的此表上做滞后处理以打印引号中的差异,例如: 问题答案: 这是我最喜欢的MySQL hack。 这是模拟滞后函数的方式: 保存上一行报价的值。对于第一行,@ quot是-1。 保留当前行的报价的值。 笔记: 子句在这里很重要,就像在常规窗口函数中一样。 您可能还想使用lag 来确保计算相同引号的差异。 您也可以以相同的方式实现行计数器 与该方案相比,与使用聚合函数,存