脚本编写无尽的字母组合(正则表达式/ ASCII)

时间:2014-08-16 19:21:40

标签: php python regex bash perl

我尝试按以下要求创建所有ASCII字母(至少是拉丁字母)的所有可能组合的.txt文件:

一个。 1-5个字母
B. a-z(以及这些信件的所有可能情况)
C.第1和第2,第2和第3,第3和第4之间的空间&第4和第5,适用于所有可能的组合。

例如:

a,
b,
c,
aa,
bb,
cc,
a bc,
aa b,
aaa cz,
ga l qa,
p j asd,
n ljas,
asdl q,
a q j o z;

etc. etc.
-----

我尝试过使用PHP&amp ;;正则表达但它超出了我的联盟,因为在写这个剧本时我不能错过任何一场比赛。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

以下是一个常规实现,可以轻松修改以处理不同的字符集letters和最大长度n

请注意,我注释了maxLengthletters的原始值,并选择maxLength = 3letters = "ABC"进行测试。实际上,我不认为计算所有必需的组合是易处理的。我没试过。

import itertools

# maxLength = 5
# letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
maxLength = 3
letters = "ABC"

for length in range(1, maxLength + 1):
    string = [""] * (2 * length - 1)
    for combination in itertools.product(letters, repeat=length):
        string[::2] = combination
        for blanks in itertools.product(["", " "], repeat=length-1):
            string[1::2] = blanks
            print "".join(string)

输出:

A
B
C
AA
A A
AB
A B
.
.
.
CCB
CC B
C CB
C C B
CCC
CC C
C CC
C C C

答案 1 :(得分:0)

可以使用Algorithm::Combinatorics执行此操作。

使问题更简单的一个技巧是认识到"a"" a"可以被视为两个不同的字母,所以我们实际上只处理一组52个可能的字母(上部和下部)后跟104个可能的字母组(上部和下部,前缀带或不带空格)。

以下脚本演示了一个小得多的排列转换:

use strict;
use warnings;

use Algorithm::Combinatorics qw(variations_with_repetition);

#my $maxlength = 5;
#my @letters   = ( 'a' .. 'z', 'A' .. 'Z' );
my $maxlength = 3;
my @letters   = ( 'a' .. 'c' );

for my $prefix (@letters) {
    print "$prefix\n";
    for my $length ( 1 .. $maxlength - 1 ) {
        my $iter = variations_with_repetition( [ map { ( $_, " $_" ) } @letters ], $length );
        while ( my $p = $iter->next ) {
            print $prefix, @$p, "\n";
        }
    }
}

输出:

a
aa
a a
ab
a b
ac
a c
aaa
aa a
aab
aa b
aac
aa c
a aa
a a a
a ab
a a b
a ac
a a c
aba
ab a
abb
ab b
abc
ab c
a ba
a b a
a bb
a b b
a bc
a b c
aca
ac a
acb
ac b
acc
ac c
a ca
a c a
a cb
a c b
a cc
a c c
b
ba
b a
bb
b b
bc
b c
baa
ba a
bab
ba b
bac
ba c
b aa
b a a
b ab
b a b
b ac
b a c
bba
bb a
bbb
bb b
bbc
bb c
b ba
b b a
b bb
b b b
b bc
b b c
bca
bc a
bcb
bc b
bcc
bc c
b ca
b c a
b cb
b c b
b cc
b c c
c
ca
c a
cb
c b
cc
c c
caa
ca a
cab
ca b
cac
ca c
c aa
c a a
c ab
c a b
c ac
c a c
cba
cb a
cbb
cb b
cbc
cb c
c ba
c b a
c bb
c b b
c bc
c b c
cca
cc a
ccb
cc b
ccc
cc c
c ca
c c a
c cb
c c b
c cc
c c c

附录

为了好玩,我创建了一个通过排列工作的脚本,并在后缀中添加了空格:

use strict;
use warnings;

use Algorithm::Combinatorics qw(variations_with_repetition);
use List::MoreUtils qw(mesh);

#my $maxlength = 5;
#my @letters   = ( 'a' .. 'z', 'A' .. 'Z' );
my $maxlength = 3;
my @letters   = ( 'a' .. 'c' );

for my $length ( 1 .. $maxlength ) {
    my $iter = variations_with_repetition( \@letters, $length );
    while ( my $p = $iter->next ) {
        print @$p, "\n";
        for my $spaces ( 1 .. 2**( $length - 1 ) - 1 ) {
            my @spaces = (map({$_ ? ' ' : ''} split //, sprintf "%0*b", $length - 1, $spaces), '');
            print mesh(@$p, @spaces), "\n";
        }
    }
}