python - 替换字符组合
问题描述
我有一个字符串27AAGCB5913L2ZF
。如果字符串中出现任何一个A
或J
或K
,那么我需要将它们更改为三个字母的所有可能组合。如果我将上面的字符串输入传递给程序,那么输出应该是这样的
27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27JKGCB5913L2ZF
27JJGCB5913L2ZF
27KKGCB5913L2ZF
字母可能出现在字符串中的任何位置。如果只有一个字母,则必须依次替换为A
,J
和K
。例如,字符串的输出27ABGCB5913L2ZF
应如下所示
27ABGCB5913L2ZF
27JBGCB5913L2ZF
27kBGCB5913L2ZF
我可以用这样的代码搜索给定的字符
while ( $string =~ /(B)/g ) {
say $1, ' at ', pos $string;
}
如果可以有任意数量的 , 或在任何位置,我如何生成所有可能A
的J
字符串K
?
解决方案
您想要的关键字母A
,J
和的组合集合K
称为
笛卡尔积。在 Python 中,您可以使用
itertools.product
它们来生成它们。
首先,我们需要找到输入字符串中所有关键字母的位置。使用内置
enumerate
函数的简单方法。一旦我知道了这些位置,以及字符串包含多少个关键字母,我们就可以生成笛卡尔积的每个项目,替换关键字母,并打印新字符串。
在 Python 中,字符串是不可变的(它们无法更改),因此我将字符串转换为字符列表,替换关键位置的字符,然后使用该
str.join
方法从列表中构建一个新字符串。
以下代码适用于 Python 版本 2 和 3
Python
from itertools import product
def make_patterns(s):
keyletters = 'AJK'
# Convert input string into a list so we can easily substitute letters
seq = list(s)
# Find indices of key letters in seq
indices = [ i for i, c in enumerate(seq) if c in keyletters ]
# Generate key letter combinations & place them into the list
for t in product(keyletters, repeat=len(indices)):
for i, c in zip(indices, t):
seq[i] = c
print(''.join(seq))
# Test
data = (
'1ABC2',
'27AAGCB5913L2ZF',
'3A4J',
'5K67KA',
)
for s in data:
print('\nInput:', s)
make_patterns(s)
输出
Input: 1ABC2
1ABC2
1JBC2
1KBC2
Input: 27AAGCB5913L2ZF
27AAGCB5913L2ZF
27AJGCB5913L2ZF
27AKGCB5913L2ZF
27JAGCB5913L2ZF
27JJGCB5913L2ZF
27JKGCB5913L2ZF
27KAGCB5913L2ZF
27KJGCB5913L2ZF
27KKGCB5913L2ZF
Input: 3A4J
3A4A
3A4J
3A4K
3J4A
3J4J
3J4K
3K4A
3K4J
3K4K
Input: 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
from itertools import product
def make_patterns(s):
keyletters = 'AJK'
# Convert input string into a list so we can easily substitute letters
seq = list(s)
# Find indices of key letters in seq
indices = [i for i, c in enumerate(seq) if c in keyletters]
# Generate key letter combinations & place them into the list
for t in product(keyletters, repeat=len(indices)):
for i, c in zip(indices, t):
seq[i] = c
yield ''.join(seq)
# Test
print(list(make_patterns('A12K')))
for s in make_patterns('3KJ4'):
print(s)
输出
['A12A', 'A12J', 'A12K', 'J12A', 'J12J', 'J12K', 'K12A', 'K12J', 'K12K']
3AA4
3AJ4
3AK4
3JA4
3JJ4
3JK4
3KA4
3KJ4
3KK4
推荐阅读
- c# - 贪婪的正则表达式找到最新的大括号
- javascript - 更换innerHTML 与 document.getElementById 使用 var
- codeigniter - 模型和控制器查询以将 timein 和 timeout 与 codeigniter 中的单行合并
- c++ - 将 gcc 升级到 8/9 触发“错误:不支持的指令‘vmovdqu’”,而 gcc-7 运行正常
- python - 无法在 Jupyter 中打开 Octave
- python-3.x - 检查字符串中连续出现的次数[已解决]
- python - 如何在 Django 中动态限制 FloatField?
- python - 修复导入 Flask 蓝图时的循环导入
- cypress - 能够在单个 npm 脚本中运行测试套件以生成 testrail 和 mochawesome 报告
- jquery - jQuery 事件监听器处理这个