我有一个包含数字的字符串。字符串需要用3的块分隔数字。如有必要,最后一个块或最后两个块可以包含2个数字(但绝不能包含1个数字)。
示例:
"123456789" -> "123-456-789"
"1234567891" -> "123-456-78-91"
"12345678912" -> "123-456-789-12"
直接处理三个部分是很简单的:
'-'.join(S[i:i+3] for i in range(0, len(S),3))
我该如何扩展?
答案 0 :(得分:1)
描述状况的另一种方法是:“将所有内容分成三块。如果最后一块具有一个元素,则从该块中抢出一个。” textwrap.wrap
提供了一个很好的工具来分解字符串:
from textwrap import wrap
pieces = wrap(S, 3)
if len(pieces[-1]) == 1:
pieces [-2:] = pieces[-2][:-1], pieces[-2][-1] + pieces[-1]
result = '-'.join(pieces)
答案 1 :(得分:0)
result = '-'.join(S[i:i+3] for i in range(0, len(S),3)) if len(S)%3 != 1 else '-'.join([S[i:i+3] for i in range(0, len(S)-4, 3)] + [S[-4:-2], S[-2:]])
答案 2 :(得分:0)
使用正则表达式可以最轻松地解决此问题。您可以将re.findall
与以下正则表达式一起使用,以找到字符串末尾的一组或两组两位数或其他位置的三位数字,然后将非空组与'-'
结合使用,生成器表达式:
import re
def format_phone_number(s):
return '-'.join(i for t in re.findall(r'(\d{2})(\d{2})?$|(\d{3})', s) for i in t if i)
这样:
print(format_phone_number('123456789'))
print(format_phone_number('1234567891'))
print(format_phone_number('12345678912'))
将输出:
123-456-789
123-456-78-91
123-456-789-12
答案 3 :(得分:0)
我编写了一个简单易懂的程序来解决此问题。您可以按照以下方式进行操作:
def SeparateNum(S):
l=len(S)
S0=""
rem=l%3
if rem==0:
for i in range(l):
if i%3==0 and i!=0:
S0=S0+"-"
S0=S0+S[i]
elif rem==1:
for i in range(l-4):
if i%3==0 and i!=0:
S0=S0+"-"
S0=S0+S[i]
S0=S0+"-"+S[l-4]+S[l-3]+"-"+S[l-2]+S[l-1]
elif rem==2:
for i in range(l-2):
if i%3==0 and i!=0:
S0=S0+"-"
S0=S0+S[i]
S0=S0+"-"+S[l-2]+S[l-1]
return S0
print(SeparateNum("12345678987"))
print(SeparateNum("123456789"))
print(SeparateNum("1234567898"))