我想解析一个字符串,例如:
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
因为有多个uses-permission,我希望获得权限作为列表,包含:
WRITE_APN_SETTINGS
,RECEIVE_BOOT_COMPLETED
和ACCESS_NETWORK_STATE
。
你能帮我写一下python正则表达式来获取我想要的字符串吗? 感谢。
答案 0 :(得分: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
表示任何字母数字字符和下划线。 \.
是一个转义期,因此正则表达式知道我们的意思是.
而不是未转义的句号代表的正则表达式命令。将它们放在[]
中意味着我们对括号中的任何内容都没有问题,所以我们说我们会接受任何字母数字字符_
或.
。 +
后缀表示至少一个前一个,意味着至少有一个(但可能更多)[\w\.]
。最后,?
表示不贪婪 - 我们告诉正则表达式获得符合这些规范的最小可能组,因为+
可以继续与[\w\.]
匹配的任意数量的无限次重复。(?=\')
:检查主要字符串后面的 ,以便仅返回'
后面的字符串。 \
也是一个转义,因为否则正则表达式或Python的字符串执行可能会误解'
。最终'
不与我们的结果一起返回,我们只知道在原始字符串中,它跟随我们最终得到的任何结果。答案 1 :(得分: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'"
>>>
答案 2 :(得分: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文件包含您之前提到的输入数据..