查找字符串中最后一个数字的最佳方法



我有具有变量名称的图像,唯一一致的特征/事情是图像编号位于名称的末尾,就在扩展之前。例如:"im1.png";Image 02.tif";,"whatever_17_morewhatever - 31. tiff">

什么是最好的方法找到最后一个号码吗?

我可以这样做:

  • 查找最后一个点
  • 当我检测到数字时返回
  • 返回最后检测到的数字(包含)和点(排除)之间的字符串。但是有没有更好/更快/自动的方法来做呢?

您可以使用re.findall并找到数字然后返回最后一个数字。

import re
lst = ["im1.png", "Image 02.tif", "My3rdImage_3.jpg" , "Whatever_17_MoreWhatever-31.tiff"]
for l in lst:
print(re.findall(r'd+', l)[-1])

输出:

1
02
3
31

解释:

>>> re.findall(r'd+', "Whatever_17_MoreWhatever-31.tiff")
['17', '31']

不知道这是不是"最好的办法";但你可以用regex来做它会自动选择字符串中的最后一个数字:

编辑此模式搜索字符串中后面没有另一个数字的任何数字(或数)。所以你总是得到最后一个数字。re.search:

lst = ["im.png", "Image 02.tif", "My3rdImage_3.jpg" , "Whatever_17_MoreWhatever-31.tiff", "My4rdImage22_445.jpg"]
pat = r"(d+)(?!.*d+)"
for elem in lst:
tmp = re.search(pat, elem)
if tmp:
print(tmp[0])
02
3
31
445

或者(归功于@Mad physics)搜索"一组数字后面跟着非数字,然后字符串结束"的模式

lst = ["im.png", "Image 02.tif", "My3rdImage_3.jpg" , "Whatever_17_MoreWhatever-31.tiff", "My4rdImage22_445.jpg"]
pat = r"(d+)(?=D*$)"
for elem in lst:
tmp = re.search(pat, elem)
if tmp:
print(tmp[0])
02
3
31
445

re.findall

import re
lst = ["im1.png", "Image 02.tif", "My3rdImage_3.jpg" , "Whatever_17_MoreWhatever-31.tiff"]
pattern = r"d+"
for elem in lst:
tmp = re.findall(pattern, elem)
print(tmp)
print(tmp[-1], 'n')
['1']
1 
['02']
02 
['3', '3']
3 
['17', '31']
31 

的帮助下模块可以做:

import re
filenames = ["im1.png", "Image 02.tif", "My3rdImage_3.jpg" , "Whatever_17_MoreWhatever-31.tiff"]
for filename in filenames:
print(re.search('(d+)D+$', filename).group(1))

表达式匹配位于字符串

末尾的非数字序列之前的数字序列。输出:

1
02
3
31

使用正则表达式最有效和最简单的方法,如果使用预编译表达式,速度将是高性能和稳定的。

下面的例子实现了以下算法,正则表达式查找字符串的结尾- '$',然后读取'之后的文件扩展名。D*',并将数字放入匹配的组1 '( D*)'。

import re
regex = re.compile(r'(d*).D*$', re.X)
test_str = ("Whatever_17_MoreWhatever-31.tiff",
"My3rdImage_3.jpg",
"Image 02.tif",
"im1.png",
"im.png", 
"foo",
"1357.137",
"–Æ–ù–ò–ö–û–î 12 22.txt")
for s in test_str:
num = None
match = regex.search(s)
if match:
num = match.group(1)
print(f"For string {s} last number is",
f"{num if num else 'empty'}")

更多细节可以在这里阅读:https://docs.python.org/3/howto/regex.html

使用filter只获取字符串的数字

使用[-1]获取字符串的最后一个字符。

last_number = filter(str.isdigit, text)[-1]

相关内容

最新更新