1

我想解析一个字符串,例如:

package: name='jp.tjkapp.droid1lwp' versionCode='2' versionName='1.1'
uses-permission:'android.permission.WRITE_APN_SETTINGS'
uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'

我想得到:

string1: jp.tjkapp.droidllwp`

string2: 1.1

因为有多个使用权限,我想以列表的形式获得权限,包含 WRITE_APN_SETTINGSRECEIVE_BOOT_COMPLETEDACCESS_NETWORK_STATE

你能帮我写python正则表达式来得到我想要的字符串吗?谢谢。

4

3 回答 3

1

假设您提供的代码块是一个长字符串,这里存储在一个名为的变量中input_string

name = re.search(r"(?<=name\=\')[\w\.]+?(?=\')", input_string).group(0)
versionName = re.search(r"(?<=versionName\=\')\d+?\.\d+?(?=\')", input_string).group(0)
permissions = re.findall(r'(?<=android\.permission\.)[A-Z_]+(?=\')', input_string)

解释:

姓名

  • (?<=name\=\'):在主字符串之前name='检查,以便仅返回以 . 开头的字符串。前面\='用于转义它们,以便正则表达式知道我们在谈论=字符串而不是正则表达式命令。 name='得到结果的时候也不返回,我们只知道得到的结果都是在它前面的。
  • [\w\.]+?: 这是我们要搜索的主要字符串。\w表示任何字母数字字符和下划线。 \.是一个转义句点,因此正则表达式知道我们的意思.,而不是由未转义句点表示的正则表达式命令。把这些放进去[]意味着我们可以接受任何我们放在括号里的东西,所以我们说我们会接受任何字母数字字符_,或.+afterwords 表示至少一个之前的事情,意思是至少一个(但可能更多)的[\w\.]。最后,?方法不要贪心——我们告诉正则表达式获得满足这些规范的最小可能组,+[\w\.].
  • (?=\'): 检查主字符串后面,以便只返回后面跟着 . 的字符串'。这\也是一种转义,因为否则正则表达式或 Python 的字符串执行可能会误解'. 这个 final'不会与我们的结果一起返回,我们只知道在原始字符串中,它遵循我们最终得到的任何结果。
于 2012-10-16T06:09:47.877 回答
0

您可以通过逐行读取文件内容来执行此操作而无需正则表达式。

>>> def split_string(s):
...     if s.startswith('package'):
...             return [i.split('=')[1] for i in s.split() if "=" in i]
...     elif s.startswith('uses-permission'):
...             return s.split('.')[-1]
... 
>>> split_string("package: name='jp.tjkapp.droid1lwp' versionCode='2' versionName='1.1'")
["'jp.tjkapp.droid1lwp'", "'2'", "'1.1'"]
>>> split_string("uses-permission:'android.permission.WRITE_APN_SETTINGS'")
"WRITE_APN_SETTINGS'"
>>> split_string("uses-permission:'android.permission.RECEIVE_BOOT_COMPLETED'")
"RECEIVE_BOOT_COMPLETED'"
>>> split_string("uses-permission:'android.permission.ACCESS_NETWORK_STATE'")
"ACCESS_NETWORK_STATE'"
>>> 
于 2012-10-16T06:19:40.570 回答
0

这是一个示例代码

#!/usr/bin/env python
inputFile = open("test.txt", "r").readlines()
for line in inputFile:
    if line.startswith("package"):
        words = line.split()
        string1 = words[1].split("=")[1].replace("'","")
        string2 = words[3].split("=")[1].replace("'","")

test.txt 文件包含您之前提到的输入数据..

于 2012-10-16T21:13:33.410 回答