Python名称缩写查找

时间:2015-03-09 22:16:25

标签: python maya

我得到的信息如下所示

xy123, xy0123, xyz_123, and xy01

XYZ是不同的字母而123是不同的数字。例如QWA_0230。我有时会用_分隔任何数量的字母和数字。

我对一行代码感兴趣,无论是否有_或者没有尽可能多的字母,我都会在开头找到这些字母。现在,如果有_,我可以找到它。但不知道如果没有,该怎么办。

name="QWA_0230"
begName=name.split("_")[0]
#begName=QWA

#name2="QW0210"
#want the same code to work with this kind of name

我想我需要一个if语句来查找是否有_如果是真的运行我得到的。如果为false则运行其他可以在字母停止且数字开始时解密的内容。

2 个答案:

答案 0 :(得分:2)

您也可以使用正则表达式执行此操作:

import re
expr = re.compile("([a-z]+)(_?)([0-9]+)", re.I)  # case insensitive
expr.search("QWA_0230").groups()
#  ('QWA', '_', '0230')

expr.search("xy123").groups()
#  ('xy', None, '123')

如果有数据既没有数字也没有字母,你需要检查搜索结果是否为:

result = expr.search("xy123")
if not result: 
   return (None,None,None)
return result.groups()

字母将始终为组[0],数字将为组[-1]

答案 1 :(得分:1)

您可以使用itertools.takewhile,将字符带到第一个非字母字符。

from itertools import takewhile
name = "QWA_0230"

beg_name = "".join(takewhile(str.isalpha,name))
print(beg_name)
QWA


name2 = "QW0210"

beg_name = "".join(takewhile(str.isalpha,name2))
print(beg_name)
QW

对于数字,您可以使用itertools.dropwhile

name2="QW0210"

print("".join(dropwhile(lambda x: not x.isdigit(),name2)))

或者您可以在循环中使用isalphaisdigit

print("".join(x for x in name if x.isalpha()))

print("".join(x for x in name if x.isdigit())

如果速度是一个问题,这将胜过任何其他选项:

a,b = name.translate(None,"ABCDEFGHIJKLMNOPQRSTUVWXWY_"),name.translate(None,"1234567890_")

In [8]: %%timeit
res = expr.search("QWA_0230").groups()
a,b = res[0],res[-1]
   ...: 
1000000 loops, best of 3: 830 ns per loop

In [9]: timeit a,b = name.translate(None,"ABCDEFGHIJKLMNOPQRSTUVWXWY_"),name.translate(None,"1234567890_")

1000000 loops, best of 3: 510 ns per loop

In [17]: a,b = name.translate(None,"ABCDEFGHIJKLMNOPQRSTUVWXWY_"),name.translate(None,"1234567890_")
In [18]: a
Out[18]: '0230'    
In [19]: b
Out[19]: 'QWA