我有一个像
这样的字符串列表lst = ['foo000bar111', 'foo000bar1112', 'foo000bar1113']
我希望从每个字符串中提取最后一个数字以获取
nums = ['111', '1112', '1113']
我之前在字符串中有其他数字我不关心(本例中为000
)。没有空格,所以我不能lst.split()
我相信做一些没有间距的事情是很困难的。这些数字的长度不同,所以我不能只做str[-3:]
。值得一提的是,我关心的数字前面的字符在每个字符串中都是相同的,数字位于字符串的末尾。
我正在寻找一种说'好的方法,直到你找到bar
然后再告诉我剩下的字符串是什么。“我提出的最好的是[str[(str.index('bar')+3):] for str in lst]
,它有效,但我怀疑这是最诡计多端的方式。
答案 0 :(得分:5)
您的方法准确无误。您也可以尝试使用re
>>> import re
>>> lst = ['foo000bar111', 'foo000bar1112', 'foo000bar1113']
>>> [re.search(r'(\d+$)',i).group() for i in lst]
['111', '1112', '1113']
您还可以尝试rindex
>>> [i[i.rindex('r')+1:] for i in lst]
['111', '1112', '1113']
答案 1 :(得分:2)
你自己的解决方案运行良好,但我认为主要的问题是你必须硬编码你正在使用的搜索字符串的长度。这可以使用像这样的临时变量来解决:
tag = 'bar'
[s[(s.index(tag)+len(tag)):] for s in lst]
使用rsplit的另一种方式:
[x.rsplit('bar', 1)[1] for x in lst]
这总是在bar
的最后一次出现时分开,即使它出现不止一次。
答案 2 :(得分:2)
您的解决方案一点都不差,但您可以通过以下几种方式改进它:
使用rindex()
代替索引;如果bar
恰好在字符串中出现两次(或更多),您想要找到最后一个实例。
或者您可以使用rsplit()
:
[ s.rsplit("bar", 1)[1] for s in lst ]
编辑: @Bas几秒钟就把我打到了第二个解决方案! : - )