如何在字符串每两个字符后插入一个字符

52 投票
7 回答
73346 浏览
提问于 2025-04-16 01:21

有没有一种简单的方法可以在字符串的每两个字符之间插入一个元素?

我有一个字符串:'aabbccdd',我想要的结果是 'aa-bb-cc-dd'。

我不太确定该怎么做。

7 个回答

6

我通常会用正则表达式来处理这个问题,因为它看起来更简洁,而且通常比其他方法更快。除了要面对关于正则表达式的传统看法,我觉得没有什么缺点。

>>> s = 'aabbccdd'
>>> '-'.join(re.findall('..', s))
'aa-bb-cc-dd'

不过,这个版本对实际的配对要求比较严格:

>>> t = s + 'e'
>>> '-'.join(re.findall('..', t)) 
'aa-bb-cc-dd'

...所以稍微调整一下,你就可以处理奇数长度的字符串了:

>>> '-'.join(re.findall('..?', t))
'aa-bb-cc-dd-e'

通常你会多次执行这个操作,所以可以提前创建一个快捷方式来节省时间:

PAIRS = re.compile('..').findall

out = '-'.join(PAIRS(in))

或者我在实际代码中会用这样的方式:

def rejoined(src, sep='-', _split=re.compile('..').findall):
    return sep.join(_split(src))

>>> rejoined('aabbccdd', sep=':')
'aa:bb:cc:dd'

我有时会用类似的方式来从6字节的二进制输入创建MAC地址的表示:

>>> addr = b'\xdc\xf7\x09\x11\xa0\x49'
>>> rejoined(addr[::-1].hex(), sep=':')
'49:a0:11:09:f7:dc'
72
>>> s = 'aabbccdd'
>>> '-'.join(s[i:i+2] for i in range(0, len(s), 2))
'aa-bb-cc-dd'

这段代码是用来做某些操作的,但具体的功能和用途需要根据上下文来理解。通常情况下,代码块里会包含一些指令或者逻辑,帮助程序完成特定的任务。

如果你看到这样的代码块,通常意味着它是一个示例,展示了如何使用某个功能或者解决某个问题。理解这些代码的关键在于逐行分析,看看每一行是做什么的,以及它们是如何相互配合的。

总之,代码块是编程中非常重要的一部分,掌握它们能帮助你更好地理解和使用程序。

59

假设这个字符串的长度总是偶数,

>>> s = '12345678'
>>> t = iter(s)
>>> '-'.join(a+b for a,b in zip(t, t))
'12-34-56-78'

这里的 t 也可以通过以下方式去掉:

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2]))
'12-34-56-78'

这个算法的思路是把字符串分成一对一对的,然后用 - 字符把它们连接起来。

代码是这样写的。首先,把字符串分成奇数位和偶数位的数字。

>>> s[::2], s[1::2]
('1357', '2468')

然后使用 这个 zip 函数 把它们组合成一个可迭代的元组。

>>> list( zip(s[::2], s[1::2]) )
[('1', '2'), ('3', '4'), ('5', '6'), ('7', '8')]

但是元组并不是我们想要的。我们需要的是一个字符串的列表。这就是列表推导式的目的。

>>> [a+b for a,b in zip(s[::2], s[1::2])]
['12', '34', '56', '78']

最后,我们使用 str.join() 来把这个列表合并起来。

>>> '-'.join(a+b for a,b in zip(s[::2], s[1::2]))
'12-34-56-78'

第一段代码的思路是一样的,但如果字符串很长,它会消耗更少的内存。

撰写回答