Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换字符组合_Python_Perl_Replace_Combinations - Fatal编程技术网

Python 替换字符组合

Python 替换字符组合,python,perl,replace,combinations,Python,Perl,Replace,Combinations,我有一个字符串27AAGCB5913L2ZF。如果字符串中出现A或J或K中的任何一个,则我需要将它们更改为三个字母的所有可能组合。如果我将上面的字符串输入传递给程序,那么输出应该是这样的 27AAGCB5913L2ZF 27AJGCB5913L2ZF 27AKGCB5913L2ZF 27JAGCB5913L2ZF 27KAGCB5913L2ZF 27KJGCB5913L2ZF 27JKGCB5913L2ZF 27JJGCB5913L2ZF 27KKGCB5913L2ZF 字母可以出现在字符串中

我有一个字符串
27AAGCB5913L2ZF
。如果字符串中出现
A
J
K
中的任何一个,则我需要将它们更改为三个字母的所有可能组合。如果我将上面的字符串输入传递给程序,那么输出应该是这样的

27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27JKGCB5913L2ZF
27JJGCB5913L2ZF
27KKGCB5913L2ZF
字母可以出现在字符串中的任何位置。如果只有一个字母,则必须依次用
a
J
K
替换。例如,字符串
27ABGCB5913L2ZF
的输出应如下所示

27ABGCB5913L2ZF
27JBGCB5913L2ZF
27kBGCB5913L2ZF
我可以用这样的代码搜索给定的字符

while($string=~/(B)/g){
说$1,'at',pos$字符串;
}

如果在任何位置都可能有任意数量的
A
J
K
,我如何生成所有可能的字符串?

您想要的关键字字母
A
J
K
的组合集合称为 . 在Python中,可以使用 生成它们

首先,我们需要找到输入字符串中所有关键字母的位置。使用内置的 功能。一旦我知道了这些位置,以及字符串包含了多少关键字母,我们就可以生成笛卡尔乘积的每一项,替换关键字母,并打印新字符串

在Python中,字符串是不可变的(不能更改),因此我将字符串转换为字符列表,替换关键位置的字符,然后使用 方法

下面的代码将适用于Python的版本2和版本3

python 来自itertools导入产品的

def制造模式:
keyletters='AJK'
#将输入字符串转换为一个列表,以便我们可以轻松地替换字母
序号=列表
#查找seq中关键字母的索引
索引=[i表示i,c表示枚举(seq),如果c表示键字母]
#生成关键字母组合并将其放入列表中
对于产品中的t(关键字字母,重复=长度(索引)):
对于zip中的i,c(索引,t):
序号[i]=c
打印(''.join(seq))
#试验
数据=(
“1ABC2”,
‘27AAGCB5913L2ZF’,
“3A4J”,
“5K67KA”,
)
对于数据中的s:
打印(“\n输入:”,s)
制作图案
输出
输入:1ABC2
1ABC2
1JBC2
1KBC2
输入:27AAGCB5913L2ZF
27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27JJGCB5913L2ZF
27JKGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27KKGCB5913L2ZF
输入:3A4J
3A4A
3A4J
3A4K
3J4A
3J4J
3J4K
3K4A
3K4J
3K4K
输入:5K67KA
5A67AA
5A67AJ
5A67AK
5A67JA
5A67JJ
5A67JK
5A67KA
5A67KJ
5A67KK
5J67AA
5J67AJ
5J67AK
5J67JA
5J67JJ
5J67JK
5J67KA
5J67KJ
5J67KK
5K67AA
5K67AJ
5K67AK
5K67JA
5K67JJ
5K67JK
5K67KA
5K67KJ
5K67KK

只要稍作改动,我们就可以把函数变成一个生成器。这使您可以轻松地循环输出字符串,或者根据需要将其转换为列表

python 来自itertools导入产品的

def制造模式:
keyletters='AJK'
#将输入字符串转换为一个列表,以便我们可以轻松地替换字母
序号=列表
#查找seq中关键字母的索引
索引=[i表示i,c表示枚举(seq),如果c表示键字母]
#生成关键字母组合并将其放入列表中
对于产品中的t(关键字字母,重复=长度(索引)):
对于zip中的i,c(索引,t):
序号[i]=c
收益率“”。加入(seq)
#试验
打印(列表(制作图案('A12K'))
对于make_模式(“3KJ4”)中的s:
印刷品
输出
['A12A','A12J','A12K','J12A','J12J','J12K','K12A','K12J','K12K']
3AA4
3AJ4
3AK4
3JA4
3JJ4
3JK4
3KA4
3KJ4
3KK4

这可以在Perl中通过使用
glob
操作符来完成
glob
用于查找匹配的文件,但如果模式中不包含通用通配符(
*
[…]
),则它将简单地返回所有可能的匹配项,无论它们是否作为文件存在

此Perl代码使用替换来形成全局模式,方法是将所有出现的
a
J
K
替换为多个模式
{a,J,K}
。将结果提交到
glob
将为我们提供所需的输出

使用严格;
使用“全部”警告;
使用特征“说”;
对于我的$s(qw/27AAGCB5913L2ZF 27KBGCB5913L2ZF/){
(my$patt=$s)=~s/[AJK]/{A,J,K}/g;
比如说glob$patt;
说“”;
}
输出
27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27JJGCB5913L2ZF
27JKGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27KKGCB5913L2ZF
27ABGCB5913L2ZF
27JBGCB5913L2ZF
27KBGCB5913L2ZF

以下是Perl中的递归解决方案:

my $str = '27AAGCB5913L2ZF';
my @replace = qw (A J K);
print_string( $str);

sub print_string {
    my ( $str, $replace, $start) = @_;

    if (defined $replace) {
        substr( $str, $start, 1) = $replace;
    }
    else {
        $start = -1;
    }
    pos( $str) = $start +1;
    if ($str =~ /\G.*?(A|J|K)/g) {
        my $cur_start = $-[-1];
        print_string( $str, $_, $cur_start) for @replace;
    }
    else {
        say $str;
    }
}
输出

27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27JJGCB5913L2ZF
27JKGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27KKGCB5913L2ZF
一个简短的解决方案:

首先,将字符串拆分为可能出现在每个位置的字符元组

>>> s = "27AAGCB5913L2ZF"
>>> p2 = [("A","J","K") if c in "AJK" else (c,) for c in s]
>>> p2
[('2',), ('7',), ('A', 'J', 'K'), ('A', 'J', 'K'), ('G',), ('C',), ('B',), ('5',), ('9',), ('1',), ('3',), ('L',), ('2',), ('Z',), ('F',)]
然后,此函数将元组列表重新组合为字符串:

def assemble(t, s=''):
    if t:
        for c in t[0]:
            assemble(t[1:], s+c)
    else:
        print(s)

>>> assemble(p2)
27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27JJGCB5913L2ZF
27JKGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27KKGCB5913L2ZF

如果存在单个字母K,则必须在其自身位置上替换A、J和K。例如27KBGCB5913L2ZF,则输出应为。。27ABGCB5913L2ZF 27JBGCB5913L2ZF 27KBGCB5913L2ZF请原谅我的偏见,但“只要稍作改变,我们就可以把我们的函数变成一个生成器”(以及有关笛卡尔产品的教育)有点像刚从大学毕业、渴望分数的人。这里不需要迭代器:它总是被调用到耗尽状态,也可以作为一个简单的列表来交付。让我们不要用杂技来解决普通问题。@Borodin在Python3中,许多以前在早期版本中返回列表的函数现在返回迭代器。对于这个任务,我认为迭代器是合适的,因为它不需要在