在python中遇到数字时拆分系列中的字符串

时间:2014-07-09 17:49:55

标签: python python-2.7 pandas

我在数据帧中有一系列字符串,我想在数字开始后删除字符串中的所有内容。这是一个例子:

sstrings['abc12390859', 'def1959836', 'dab3496876', 'gh34643267']

所以,最后,我希望它是:

sstrings['abc', 'def', 'dab', 'gh']

我想做类似的事情:

df['sstrings'] = df['sstrings'].str.split()

但由于领先的数字并不总是相同,我不确定如何做到这一点。

我看到了this,但这似乎不适用于一个系列。

有没有办法在不循环播放系列并使用re.split的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

您可以使用正则表达式。演示:

>>> import re
>>> s = ['abc12390859', 'def1959836', 'dab3496876', 'gh34643267']    
>>> ss = [re.match(r'[^\d]+', x).group(0) for x in s]
>>> ss
['abc', 'def', 'dab', 'gh']

说明:

\d匹配任何数字 [^\d]匹配任何不是数字的东西 [^\d]+匹配一个或多个非数字的序列。

可以找到re.match的文档here。如果字符串开头的零个或多个字符与我们的模式MatchObject匹配,它将返回group(我们从中提取匹配的字符串[^\d]+)。 re.match已应用于原始列表x中的所有s并具有列表推导。

答案 1 :(得分:0)

如果每个字符串的最后部分仅由数字组成,您可以使用:

>>> lst = ['abc12390859', 'def1959836', 'dab3496876', 'gh34643267']
>>> map(lambda txt: txt.rstrip("0123456789"), lst)
['abc', 'def', 'dab', 'gh']

或使用列表理解:

>>> [txt.rstrip("0123456789") for txt in  lst]
['abc', 'def', 'dab', 'gh']