我得到的信息如下所示
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则运行其他可以在字母停止且数字开始时解密的内容。
答案 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)))
或者您可以在循环中使用isalpha
或isdigit
:
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