我有一个文件名列表,其中一些文件名以版本号结尾。我正在尝试使用单个正则表达式提取版本号:
// The code below will retrieve everything in the "info" column and print it to console
// This prints "Nails Salon" x 5, "Restaurant" x3 and "Coffee Shop" x 7 in the order that they were scanned (Unorganised)
// What block of code could I make to display what PFuser.current currently has in their parse?
// E.g. PFUser has scanned "Nail Salon" 5 Times, "Restaurant" 3 time etc etc
let infoCheck = PFQuery(className: "UserQRCodes")
infoCheck.whereKey("info", contains: "")
infoCheck.findObjectsInBackground { (objects: [PFObject]?, error: Error?) in
if let error = error {
print(error.localizedDescription)
} else if let objects = objects {
print(objects)
}
}
// To retrieve everything the USER has scanned and display it as String on the APP
let query = PFQuery(className: "UserQRCodes")
query.whereKey("userName", equalTo: PFUser.current()!)
query.findObjectsInBackground { (objects: [PFObject]?, error: Error?) in
if let error = error {
//log details of the failure
print(error.localizedDescription)
} else if let objects = objects {
let stampees: Int = objects.count
let totalStampees = String(stampees)
self.stampeesCollectedLabel.text = totalStampees
print(objects.count)
}
}
// Do any additional setup after loading the view.
}
到目前为止,我发现以下正则表达式将其与扩展名一同提取:
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 :(得分:1)
我要搜索的是
[0-9]+\.[0-9]+
就在字符串中最后一个点之前出现
您可以使用
r'[0-9]+\.[0-9]+(?=\.[^.]*$)'
请参见regex demo。
详细信息
[0-9]+\.[0-9]+
-1个以上数字,.
和1个以上数字(?=\.[^.]*$)
-一个正向超前查询,需要.
,然后是.
以外的0+个字符,并且字符串的结尾立即位于当前位置的右边。请参见regex graph:
答案 1 :(得分:0)
Python正则表达式具有named groups:
一个更重要的功能是命名组:组可以用名称来引用,而不是用数字来引用。
命名组的语法是特定于Python的扩展名之一:(?P ...)。名称显然是该组的名称。命名组的行为与捕获组完全相同,并且将名称与组相关联。处理捕获组的match对象方法都接受以数字表示组的整数或包含所需组名称的字符串。命名的组仍具有编号,因此您可以通过两种方式检索有关组的信息:
>> p = re.compile(r'(?P<word>\b\w+\b)') >> m = p.search( '(((( Lots of punctuation )))' ) >> m.group('word') 'Lots' >> m.group(1) 'Lots'
因此,您可以将正则表达式修改为:
(?P<version>[0-9]+\.[0-9]+)\.(docx|pdf|rtf|doc|docm)$
并使用:
found.group('version')
从找到的正则表达式匹配项中选择版本。
答案 2 :(得分:0)
试试这个-
import re
try:
version = [float(s) for s in re.findall(r'-?\d+\.?\d*', 'filename.1.0.doc')][0]
print(version)
except:
pass
在这里,如果有数字,则将其存储在变量版本中,否则将通过。
这应声工作! :)