您可以将“每个其他空格”定义为“每个空格,其后面只有一对数字,直到字符串结尾”
\s(?=(?:\b\d{1,3}\s\d{1,3}\b\s*)*$)
细分:
\s # 我们要替换的空间
(?= # 积极前瞻
(?: # 非捕获组
\b # 一个单词边界(不匹配部分数字)
\d{1,3} # 一个数字
\s # 中间有一个空格(隐式 \b)
\d{1,3} # 一个数字
\b # 一个单词边界
\s* # 一个连接到下一个数字对的空格(或者在字符串末尾没有空格)
)* # 结束非捕获组,重复(“只有数字对”)
$ # 字符串结尾(“直到字符串结尾”)
) # 结束前瞻
要选择其他个空格,您可以在$之前添加一个\d{1,3}。
但实际上,我可能会在没有正则表达式的情况下解决这个问题。
input_str = '17 3 33 79 38 3 23 119 36 3 27 17 32 10 18 9 93 6'
numbers = numbers = input_str.split(' ')
output_str = ''.join([n + ('x' if i % 2 else ' ') for i, n in enumerate(numbers)])
# => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6x'
output_str = output_str.rstrip('x')
# => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6'
或者,更喜欢itertools(虽然我个人更喜欢上面的):
from itertools import cycle
input_str = '17 3 33 79 38 3 23 119 36 3 27 17 32 10 18 9 93 6'
pairs = zip(input_str.split(' '), cycle([' ', 'x']))
# => [('17', ' '), ('3', 'x'), ('33', ' '), ... ]
output_str = ''.join(p for pair in pairs for p in pair)
# => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6x'
output_str = output_str.rstrip('x')
# => '17 3x33 79x38 3x23 119x36 3x27 17x32 10x18 9x93 6'