Python 使用正则表达式提取文件名末尾的版本号

Python 使用正则表达式提取文件名末尾的版本号,python,regex,string,Python,Regex,String,我有一个文件名列表,其中一些文件名以版本号结尾。我正在尝试使用单个正则表达式提取版本号: filename.doc --> NULL filename.1.0.doc --> 1.0 filename.2.0.pdf --> 2.0 filename.3.0.docx --> 3.0 到目前为止,我发现以下正则表达式将其与扩展一起提取: [0-9]+\.[0-9]+\.(docx | pdf | rtf | doc | docm)$ 但我宁愿不要分机。所以我要搜索的是

我有一个文件名列表,其中一些文件名以版本号结尾。我正在尝试使用单个正则表达式提取版本号:

filename.doc --> NULL
filename.1.0.doc --> 1.0
filename.2.0.pdf --> 2.0
filename.3.0.docx --> 3.0
到目前为止,我发现以下正则表达式将其与扩展一起提取:

[0-9]+\.[0-9]+\.(docx | pdf | rtf | doc | docm)$
但我宁愿不要分机。所以我要搜索的是字符串中最后一个点出现之前的
[0-9]+\[0-9]+
,但我找不到该怎么做

谢谢你的帮助

Python正则表达式具有:

一个更重要的特性是命名组:可以用名称来引用组,而不是用数字来引用它们

命名组的语法是特定于Python的扩展之一:(?p…)。显然,name是组的名称。命名组的行为与捕获组完全相同,并且还将名称与组相关联。处理捕获组的match object方法都接受按数字引用组的整数或包含所需组名称的字符串。命名组仍然是给定的数字,因此您可以通过两种方式检索有关组的信息:

>> p = re.compile(r'(?P<word>\b\w+\b)')
>> m = p.search( '(((( Lots of punctuation )))' )
>> m.group('word')
'Lots'
>> m.group(1)
'Lots'
p=re.compile(r'(?p\b\w+\b)) >>m=p.search(“((大量标点))”) >>m.group(‘单词’) “很多” >>m组(1) “很多” 因此,在您的情况下,您可以将正则表达式修改为:

(?p[0-9]+\[0-9]+)\(docx | pdf | rtf | doc | docm)$

和使用:

found.group('version')

要从找到的正则表达式匹配项中选择版本,请尝试此操作-

import re

try:
    version = [float(s) for s in re.findall(r'-?\d+\.?\d*', 'filename.1.0.doc')][0]
    print(version)
except:
    pass
在这里,如果它有一个数字,那么它将把它存储在变量版本中,否则它将通过

这应该管用!:)

我搜索的是字符串中最后一个点之前的
[0-9]+\[0-9]+

你可以用

r'[0-9]+\.[0-9]+(?=\.[^.]*$)'

详细信息

  • [0-9]+\[0-9]+
    -1+位、
    和1+位
  • (?=\..[^.]*$)
    -一个正向前瞻,需要
    ,然后是0个字符,而不是
    ,并且字符串的结尾紧靠当前位置的右侧
见:


您可以使用
r'[0-9]+\.[0-9]+(?=\...^.]*$)'