我的字符串有可选的数字和字母,例如'01a‘、'b’和'02‘。这些字符串总是有两个部分,数字在左边,字母在右边。我想把这些字符串分开,把数字和字母分开。如何以一种方式定义mySplit以获得此结果?
>>> map(mySplit, ['01123absd', 'bsdf', '02454'])
[('01123', 'absd'), (None, 'bsdf'), ('02454', None)]发布于 2014-02-20 20:14:18
您可以为此使用正则表达式。我们想要的是:
请注意,regex将创建命名组,每次调用时都会编译一次以提高效率。
import re
regex = re.compile("^(?P<numbers>\d*)(?P<letters>\w*)$")
def myFunction(entry):
(numbers, letters) = regex.search(entry).groups()
return (numbers or None, letters or None)
map(myFunction, ['01123absd', 'bsdf', '02454'])最后一行的调用提供了以下输出:
[('01123', 'absd'), (None, 'bsdf'), ('02454', None)]发布于 2014-02-20 20:00:32
类似于jramirez answer,只是稍微短了一点:
def myFunction(s):
return (''.join(c for c in s if c.isdigit()) or None,
''.join(c for c in s if c.isalpha()) or None)使用filter的时间稍微短一点
def myFunction(s):
return (''.join(filter(str.isdigit, s)) or None,
''.join(filter(str.isalpha, s)) or None)输出:
print(*map(myFunction, ['01123absd', 'bsdf', '02454', '012abc345def']))
('01123', 'absd') (None, 'bsdf') ('02454', None) ('012345', 'abcdef')发布于 2014-02-20 19:56:57
如果您不想使用regex,这是一个解决方案:
def split_num_str(my_str):
num = [x for x in my_str if x.isdigit()]
num = "".join(num)
if not num:
num = None
my_str = [x for x in my_str if x.isalpha()]
my_str = ''.join(my_str)
if not my_str:
my_str = None
return num, my_str
m = map(split_num_str, ['01123absd', 'bsdf', '02454'])
print m结果= [('01123', 'absd'), (None, 'bsdf'), ('02454', None)]
https://stackoverflow.com/questions/21917989
复制相似问题