我正在使用一组数据,这些数据的名称和用户名组合在一个字符串中。例如,如果用户被命名为#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,而不是包含字符串的列表?
答案 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)
您可以使用filter
和str.isdigit
:
''.join(list(filter(str.isdigit, foo)))
答案 4 :(得分:0)
您可以在此案例中使用正则表达式
import re
foo = "John Smith --- 1234567"
id = re.search(r'\d+',foo).group()