我按照以下模式有一系列字符串:
df[ave(1:nrow(df), df$id, FUN = max), ]
# id time x
#3 1 7 0
#3.1 1 7 0
#3.2 1 7 0
#5 2 13 1
#5.1 2 13 1
#7 3 6 0
#7.1 3 6 0
。
我需要提取最后一位数字以获取ID。我尝试使用string = 'ABCD 1NAME 123456'
方法,但是问题是它还会在
名称。
注意事项:
isdigit
中最后一位的范围是5到9。有人可以建议我替代吗? 我认为我需要测试上一个位置或下一个位置是否为数字才能提取ID,但是我无法弄清楚如何执行此测试。
答案 0 :(得分:5)
您可以使用正则表达式:
import re
pattern = re.compile('\d{5,9}$')
for match in pattern.findall('ABCD 1NAME 123456'):
print(match)
输出
123456
上面的正则表达式表示:
\d{5,9}
匹配5到9位数字$
表示数字组必须在末尾,如果该组可以在字符串中的任何位置,只需删除该符号即可。答案 1 :(得分:2)
我同意并相信@DanielMesejo的回答是我所知的最佳解决方案,但仅是提供另一种想法。
解决方案
您可以创建一个列表并将每个字符串中的所有[-1]
索引存储在其中。
string = 'ABCD 1NAME 123456'
string = string.split()
num_ids = []
num_ids.append(string[-1])
可以将其与循环一起使用以提取全部内容。
带循环:
strings = ['ABCD 1NAME 123456','BHDU 1NAME 45678','OIUS 1NAME 109028']
num_ids = []
for string in strings:
string = string.split()
num_ids.append(string[-1])
print(num_ids)
可选,可以理解
@Alexander提到
strings = ['ABCD 1NAME 123456','BHDU 1NAME 45678','OIUS 1NAME 109028']
num_ids = [string.split()[-1] for string in strings]
print(num_ids)
输出
(xenial)vash@localhost:~/python/AtBS$ python3.7 pattern.py ['123456', '45678', '109028']
答案 2 :(得分:1)
您可以使用split
用空格分隔字符串,然后用-1
对其进行索引以提取id部分。
string = 'ABCD 1NAME 123456'
val=string.split()
print(val[-1])
答案 3 :(得分:0)
rsplit()
怎么样?
s = 'ABCD 1NAME 123456'
print(s.rsplit(' ', 1)[1])
# 123456
答案 4 :(得分:0)
我假设您正在使用for循环来迭代有问题的字符串
string = 'ABCD 1NAME 123456'
for i in string:
if i.isdigit():
print(i)
您可能应该使用split():
string = 'ABCD 1NAME 123456'
for i in string.split():
if i.isdigit():
print(i)
答案 5 :(得分:-1)
您可能可以这样做:
a = string.split()
if a[-1].isdigit():
print(a[-1])
如果确实是一系列数字,它将拆分字符串并输出最右边的一个。