每四个字符插入一次

1 投票
4 回答
1488 浏览
提问于 2025-04-18 05:12

我在其他问题中看到过这个问题的解决方案,但在Python中没有找到。我想知道,如何在字符串中每隔x个字符插入一个字符?比如说,在每第四个字符后面插入一个斜杠:

Before:
AsQs7d4dJh2h

After:
AsQs/7d4d/Jh2h

我知道在Python中我需要使用切片的方式。 x = AsQs7d4dJh2h x = x[0:4]

但是这只给我第一个部分,我希望能够对任何长度的字符串都这样操作。

更新的新问题: 我想做的是把字符串分成牌对(2张牌的德州扑克),问题是算法没有考虑到'10'这张牌,所以每4个字符分开并不奏效,比如在字符串中遇到'10'牌时就会出现问题:

AsQs/10dA/h10h/2h
AsQs/10dA/h9h8/h
AsQs/10dA/h9h7/h
AsQs/10dA/h9h6/h
AsQs/10dA/h9h5/h
AsQs/10dA/h9h4/h
AsQs/10dA/h9h3/h
AsQs/10dA/h9h2/h
AsQs/10dA/h8h7/h
AsQs/10dA/h8h6/h

所以我需要帮助的是,如何在字符串中插入一个斜杠,或者提取出所有的2张牌的组合(在这个例子中是3个组合),无论字符串中有1张还是多张'10'牌?

完整的算法:

import itertools

strOutput = ""
lstMaster = ['As', 'Ks', 'Qs', 'Js', '10s', '9s', '8s', '7s', '6s', '5s', '4s', '3s', '2s',\
                 'Ad', 'Kd', 'Qd', 'Jd', '10d', '9d', '8d', '7d', '6d', '5d', '4d', '3d', '2d',\
                 'Ac', 'Kc', 'Qc', 'Jc', '10c', '9c', '8c', '7c', '6c', '5c', '4c', '3c', '2c',\
                 'Ah', 'Kh', 'Qh', 'Jh', '10h', '9h', '8h', '7h', '6h', '5h', '4h', '3h', '2h']

tupMasterEdited = itertools.combinations(lstMaster, 6)
lstMasterEdited = list(tupMasterEdited)

for combo in lstMasterEdited:
    combo = str(combo).replace("(", "").replace(")", "").replace(" ", "").replace(",", "").replace("'", "")
    combo = '/'.join([combo[i:i+4] for i in range(0, len(combo), 4)])
    print(combo)

4 个回答

0

这里有一个通用的解决方案,适用于x个字符的情况。ch这个参数可以是一个或多个字符,而且字符串中不需要有x个字符的整倍数。

from itertools import izip_longest

def insert_every(x, ch, str):
    return ch.join(''.join(chars)
                   for chars in izip_longest(*([iter(str)]*x), fillvalue=''))

print insert_every(4, '/', 'AsQs7d4dJh2h')    # AsQs/7d4d/Jh2h
print insert_every(4, '+-', 'AsQs7d4dJh2hZ')  # AsQs+-7d4d+-Jh2h+-Z
1

如果可以使用正则表达式的话:

>>> re.sub(r'(.{4})(?=.)', r'\1/', 'AsQs7d4dJh2h')
'AsQs/7d4d/Jh2h'
5

这可能不是最好的解决办法:

'/'.join([str[i:i+4] for i in range(0, len(str), 4)])

>>> str = "AsQs7d4dJh2h"
>>> '/'.join([str[i:i+4] for i in range(0, len(str), 4)])
'AsQs/7d4d/Jh2h'
>>> str = "sdfjsdhjfkbsdajka"
>>> '/'.join([str[i:i+4] for i in range(0, len(str), 4)])
'sdfj/sdhj/fkbs/dajk/a'
0

这个问题可以通过替换来解决:

 import re

 re.sub(r'((?:(?=(10|.))\2){4})(?!$)', r'\1/', 'AsQs10dAh10h2h')

(?=(10|.))\2 模拟了一个原子组(这是在re模块中没有的功能),它的意思是 (?>10|.)。这里利用了前瞻的内容是原子的这个特点。

(?!$) 是一个负向前瞻,它的意思是 后面不能是字符串的结尾

撰写回答