加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 如何使用Perl从一组字母中生成单词列表?

发布时间:2020-12-14 06:02:50 所属栏目:百科 来源:网络整理
导读:我正在寻找可能适用于此问题的模块,正则表达式或其他任何内容. 我如何以编程方式解析字符串并创建已知的英语 |西班牙语单词,我有一个字典表,我可以检查算法的随机化匹配的每个排列? 鉴于一组字符:EBLAIDL KDIOIDSI ADHFWB 该计划应该返回:BLADE AID KID K
我正在寻找可能适用于此问题的模块,正则表达式或其他任何内容.

我如何以编程方式解析字符串并创建已知的英语& |西班牙语单词,我有一个字典表,我可以检查算法的随机化匹配的每个排列?

鉴于一组字符:EBLAIDL KDIOIDSI ADHFWB

该计划应该返回:BLADE AID KID KIDS FIDDLE HOLA等….

我还希望能够定义最小值和最小值.最大字长以及音节数

输入长度无关紧要,它必须只是字母,标点符号无关紧要.

谢谢你的帮助

输入字符串中的EDITLetters可以重复使用.

例如,如果输入为:ABLED,则输出可能包含:BALL或BLEED

解决方法

你没有指定,所以我假设输入中的每个字母只能使用一次.

[你已经指定输入中的字母可以多次使用,但我会在这里留下这篇文章以防有人发现它有用.]

有效地做到这一点的关键是对单词中的字母进行排序.

abracadabra => AAAAABBCDRR
abroad      => AABDOR
drab        => ABDR

然后很明显“drab”在“abracadabra”中.

abracadabra => AAAAABBCDRR
drab        => A    B  DR

那“国外”不是.

abracadabra => AAAAABBCD RR
abroad      => AA   B  DOR

我们将排序后的字母称为“签名”.如果您可以从“A”的签名中删除字母以获得“B”的签名,则单词“B”in在单词“A”中.使用正则表达式模式很容易检查.

sig('drab') =~ /^A?A?A?A?A?B?B?C?D?R?R?z/

或者,如果我们为了效率而消除不必要的回溯,我们就会得到

sig('drab') =~ /^A?+A?+A?+A?+A?+B?+B?+C?+D?+R?+R?+z/

既然我们知道我们想要什么样的模式,那只需要构建它.

use strict;
use warnings;
use feature qw( say );

sub sig { join '',sort grep /^pLz/,split //,uc $_[0] }

my $key = shift(@ARGV);

my $pat = sig($key);
$pat =~ s/.K/?+/sg;
my $re = qr/^(?:$pat)z/s;

my $shortest = 9**9**9;
my $longest  = 0;
my $count    = 0;
while (my $word = <>) {
   chomp($word);
   next if !length($word);  # My dictionary starts with a blank line!! 
   next if sig($word) !~ /$re/;
   say $word;
   ++$count;
   $shortest = length($word) if length($word) < $shortest;
   $longest  = length($word) if length($word) > $longest;
}

say "Words:    $count";
if ($count) {
   say "Shortest: $shortest";
   say "Longest:  $longest";
}

例:

$perl script.pl EBLAIDL /usr/share/dict/words
A
Abe
Abel
Al
...
libel
lid
lie
lied

Words:    117
Shortest: 1
Longest:  6

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读