问题之前:
例如:
/path/to/apk1/history/v1/xxx.apk versionCode=1
/path/to/apk1/history/v1.3/xxx.apk versionCode=1.3
/path/to/apk/v2/xxx.apk versionCode=3
好吧,/path/to/apk/v2/xxx.apk
胜出。
def analysisApk(apkPath):
outfile = os.popen("./aapt d badging %s " % apkPath,'r').read()
match = re.compile("package: name='(\S+)' versionCode='(\d+)' versionName='(\S+)'").match(outfile)
packageName=match.group(1)
versionCode = match.group(2)
{packageName:"com.xxx.1",versionCode:2,apkPath:"/path/to/1.apk"}
[{的packageName: “com.xxx.1” 的versionCode:2,apkPath: “/路径/到/ 1.apk”},{的packageName: “com.xxx.2” 的versionCode:2,apkPath: “/path/to/2.0.apk”},
{{的packageName: “com.xxx.2” 的versionCode:1,apkPath: “/路径/到/ v2.apk”}}, ...,{{的packageName: “com.xxx.n” 的versionCode:2,apkPath: “/路径/到/ n.apk”}}]
这句话并不是真正的结果,只是我们理解这个问题的例子 答案 0 :(得分:0) 如果我理解你的问题,你可以这样做列表理解: 其中 答案 1 :(得分:0) 根据您的正则表达式,我假设您的输入是一个包含以下行的文件: 您可以通过文件句柄的 然后你可以遍历它们,使用你需要的任何正则表达式来提取你的值并将它们放在每个循环重新创建的字典中(apk_dict)。 在进入下一个循环之前,我们将字典放入循环(apk_list)之外的列表 apk_list将有: 由于我在下面解释的原因,第二行被删除了。 有些注意事项: 您正在尝试在正则表达式上使用 接下来, 您还必须处理失败的匹配尝试。我只是跳过 答案 2 :(得分:0) 由于您只想使用字典来获取带有最大 PS。要在列表中添加内容,请使用" 我的问题是什么:
3 个答案:
list_of_dicts = [extract_all_the_info(line) for line in source]
extract_all_the_info()
执行您在上面执行的正则表达式,并返回一个字典。lines = [
"package: name='/path/to/apk1/history/v1/xxx.apk' versionCode='1' versionName='one'",
"package: name='/path/to/apk1/history/v1.3/xxx.apk' versionCode='1.3' versionName='two'",
"package: name='/path/to/apk/v2/xxx.apk' versionCode='3' versionName='three'",
]
.readlines()
功能将行作为列表获取。.append()
。import re
apk_list = []
for line in lines:
apk_dict = {}
match = re.match("package: name='(\S+)' versionCode='(\d+)' versionName='(\S+)'", line)
if not match:
continue
apk_dict['name'] = match.group(1)
apk_dict['versionCode'] = match.group(2)
apk_dict['versionName'] = match.group(3)
apk_list.append(apk_dict)
print(apk_list)
[
{
'versionName': 'one',
'versionCode': '1',
'name': '/path/to/apk1/history/v1/xxx.apk'
},
{
'versionName': 'three',
'versionCode': '3',
'name': '/path/to/apk/v2/xxx.apk'
}
]
.compile()
。这不符合你的想法。要使用字符串匹配表达式,请使用.match()
。编译创建了一种“表达式对象”,您可以使用它来代替表达式。(\d+)
对于“1.3”之类的内容不起作用,因为数字之间存在非数字字符。像(\S+)
continue
的行。versionCode
的apk的路径,这将是一种过度杀伤力。
使用两个变量:path
和version
。打开第一个apk,在path
中保存apkPath,在version
中保存versionCode。转到下一个apk。如果其versionCode高于version
,请将path
设置为apkPath。转到下一个,重复直到您处理完所有apks。之后,您将在path
中拥有最高versionCode
的apk的路径。 append()
":new_list = old_list.append(item)