我有具有变量名称的图像,唯一一致的特征/事情是图像编号位于名称的末尾,就在扩展之前。例如:"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]