如何从一致格式化的字符串列表中提取ID号

时间:2017-07-03 15:18:18

标签: python string

我正在使用一组数据,这些数据的名称和用户名组合在一个字符串中。例如,如果用户被命名为#34; John Smith"他的身份证号码是1234567,字符串是" John Smith --- 1234567"。字符串的格式始终如一:

NAME [space] 3 HYPHENS [space] ID number

我正试图找到一种从这些字符串中提取ID号的方法。我发现做这样的事情:

foo = "John Smith --- 1234567"

bar = [str(s) for s in foo.split() if s.isdigit()]

我得到一个像这样的列表[' 1234567']。这将满足我的需求,但我想知道是否有更多" Pythonic" /干净的方式来做到这一点?有没有办法只返回返回的ID号和int,而不是包含字符串的列表?

5 个答案:

答案 0 :(得分:2)

正则表达式的恰当使用是“Pythonic”:

>>> import re
>>> data = "John Smith --- 1234567"
>>> idtext = re.match(r'.* --- (\d+)$', data).group(1)
>>> int(idtext)
1234567

正则表达式要求任何序列,然后是“---”标记,后跟数字,然后是行尾。根据实际数据的不同,这可能过于严格,也可能不够严格。

这是否适合您的情况,以及您是否希望任何错误处理以涵盖可能的意外情况,是您的电话。另请注意re.findall(),它允许您同时执行包含许多这些行的输入。

正如Brian M. Sheldon评论的那样,使用字符串split()(或rsplit(),如果你在最后寻找的东西而不是)在适当时也是“Pythonic”,这看起来像这样:

>>> data = "John Smith --- 1234567"
>>> idtext = data.rsplit(' --- ', 1)[1]
>>> int(idtext)
1234567

我首先展示了正则表达式版本,因为根据我的经验,在一行上执行此操作可能意味着您有一堆行并且从单行转到使用re.findall()使得这比使用迭代更简单手动上线(使用for循环或生成器等)并将拆分应用于每一行。

答案 1 :(得分:2)

如果我理解你的问题......:

data

首先,您的id = int(foo.split(' --- ')[-1]) 被分成两个部分 - foo之前和之后 - 然后该列表的最后一个元素(显然应该是ID)转换为int。

答案 2 :(得分:1)

怎么样:

$ anon push ../production_db.sql mydb
$ anon pull mydb

代替?

答案 3 :(得分:1)

您可以使用filterstr.isdigit

''.join(list(filter(str.isdigit, foo)))

答案 4 :(得分:0)

您可以在此案例中使用正则表达式

import re
foo = "John Smith --- 1234567"
id = re.search(r'\d+',foo).group()