【问题标题】:Generate substrings from a string in Perl从 Perl 中的字符串生成子字符串
【发布时间】:2016-02-22 14:37:04
【问题描述】:

我有一串字符,我想在单词之间的空格上将其分解为子字符串,但子字符串之间的空格数不应超过 4。

例如:字符串:
“黄芩素是一种特异性脂氧合酶 (LOX) 抑制剂,具有抗炎和抗氧化作用。”
生成的子字符串应如下所示
1. 黄芩素,
2. 黄芩素,一个
3. 黄芩素,一种特殊的
4. 黄芩素,一种特殊的脂氧合酶
5. 黄芩素,一种特定的脂氧合酶 (LOX)
6. 一个
7. 具体的
...
我觉得 Regex 一定有什么办法,但我不确定

编辑

我使用过的代码:

my @arr = split('\s', $line);
for(my $i=0; $i<$#arr; $i++)
{
my $str1 = $arr[$i];
my $str2 = $arr[$i].' '.$arr[$i+1];
my $str3 = $arr[$i].' '.$arr[$i+1].' '.$arr[$i+2];
my $str4 = $arr[$i].' '.$arr[$i+1].' '.$arr[$i+2].' '.$arr[$i+3];
}

我的字符串很长,通过这种方法需要很多时间。
提前致谢

【问题讨论】:

  • 为什么你认为正则表达式会有所帮助?

标签: regex string perl substring


【解决方案1】:

您可以创建一个内部循环以避免重复代码。此外,使用点运算符重复粘贴内容效率较低。

my @substrings;
for (my $i=0; $i<=$#arr; ++$i)
{
    for (my $j=0; $j<5 && $i+$j<=$#arr; ++$j)
    {
        push @substrings, join(' ', @arr[$i..$i+$j]);
    }
}

您会注意到额外的边界条件,以防止内部循环越过输入数组的末尾,并使用新数组 @substrings 来包含结果。最后,看看缩进如何帮助您了解什么是去哪里。

【讨论】:

  • SpamAssassin 中的 TextCat 模块做了类似的事情。他们使用substr 来提取子字符串,而不是重复地将东西连接在一起,这可能更有效。此外,出于性能原因,他们删除了内部循环,生成的代码有点像你的。
  • 你的回答会进一步增加时间复杂度,我想要一些在时间方面效果更好的东西。
  • 您显示的代码有两个错误,我已经纠正了,还有一个效率问题,我已经纠正了(当然缩进丢失了,我也解决了)。如果您仅从我的答案中进行那些修复和更正,它会变慢吗?无论如何,也许您应该用固定代码更新您的问题,这样我们就不必讨论那些错误修复(让它正确,然后让它快速)。我没有进行计时,但也许你应该 - dot 比join 花费多少,可能与建议但未显示的substr 相比花费多少?
猜你喜欢
  • 2011-12-02
  • 2012-03-13
  • 2010-11-29
  • 2021-02-02
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多