[英]Python 3.x: Transform string
我需要将源字符串转换为扩展字符串,例如:A1f4h3L2 => AffffhhhLL
我的代码:
source = []
answer = ''
s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
source += s1
i = 0
while i <= (len(source)-1):
if source[i].isalpha:
if source[i+1].isdigit:
if source[i+2].isdigit:
answer += (str(source[i]) * int(source[i+1] + source[i+2]))
i += 2
else:
answer += (str(source[i]) * int(source[i+1]))
i += 1
i+=1
它可以工作到“ 8X”。 异常与: ValueError:以10为基数的int()的无效文字:'8X'
我不明白为什么代码在i == 12之前有效
您可以用pythonic方式做到这一点:
>>> a="A1f4h3L2"
>>> "".join(map(lambda x,y:x*int(y),a[::2],a[1::2]))
'AffffhhhLL'
这个怎么运作:
>>> a[::2] # give me all alpahbhet
'AfhL'
>>> a[1::2] # gives me all integer
'1432'
您还可以使用zip:
>>> "".join(x*int(y) for x,y in zip(a[::2],a[1::2]))
'AffffhhhLL'
上面的数字少于10
如果数字大于10:
>>> import re
>>> s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
>>> "".join(x*int(y) for x,y in zip(re.findall('[a-zA-Z]',s1),re.findall('\d+',s1)))
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee'
使用lambda和地图:
>>> "".join(map(lambda x,y:x*int(y),re.findall('[a-zA-Z]',s1),re.findall('\d+',s1)))
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee'
如果您不想使用re,请检查以下内容:
>>> s1 = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
>>> my_list =[]
>>> my_digit =''
>>> for x in s1:
... if x.isalpha():
... if my_digit != '':
... my_list.append(my_digit)
... my_digit=''
... my_list.append(x)
... else:
... my_digit += x
...
>>> my_list
['S', '15', 'Y', '16', 'r', '13', 'g', '11', 'b', '8', 'X', '8', 'J', '15', 'Q', '9', 'V', '2', 'i', '18', 'p', '5', 'e']
现在您可以像上面这样应用任何方法:
>>> "".join(x*int(y) for x,y in zip(my_list[::2],my_list[1::2]))
我首先要转换此字符串:
A = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
到此列表:
B = ['S', '15', 'Y', '16', 'r', '13', 'g', '11', 'b', '8', 'X', '8', 'J', '15', 'Q', '9', 'V', '2', 'i', '18', 'p', '5', 'e', '10']
从A到B的转换可以通过将字符串切成段来完成:
A = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
B = []
start = 0
while start < len(A):
i = start
while A[i].isalpha():
i = i + 1
k = i
while k < len(A) and A[k].isdigit():
k = k + 1
B.append(A[start:i])
B.append(A[i:k])
start = k
现在可以更轻松地产生所需的字符串:
>>> ''.join([(B[i] * int(B[i+1])) for i in range(0, len(B), 2)])
'SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee'
您的规范没有太详细,但是您可以轻松更改正则表达式以符合您的确切要求
>>> def expand(s):
... from re import findall
... return "".join([c*int(n) for c, n in zip( findall(r'[A-Za-z]+',s),
... findall(r'[0-9]+', s))])
...
>>> print(expand(('S15Y16r13g11b8X8J15Q9V2i18p5e10'))
SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee
>>>
re
def expand(s):
non_d = [] ; d = [] ; current_digit = ""
for c in s:
if c.isdigit(): current_digit = current_digit+c
else:
non_d.append(c)
if current_digit: d.append(current_digit)
current_digit = ""
d.append(current_digit)
return("".join(c*int(n) for c,n in zip(non_d, d)))
s = 'S15Y16r13g11b8X8J15Q9V2i18p5e10'
print expand(s)
输出量
SSSSSSSSSSSSSSSYYYYYYYYYYYYYYYYrrrrrrrrrrrrrgggggggggggbbbbbbbbXXXXXXXXJJJJJJJJJJJJJJJQQQQQQQQQVViiiiiiiiiiiiiiiiiipppppeeeeeeeeee
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.