Python 如何解析此列表中的元素?
我有一个列表要解析(但我正在寻找一种通用的方法来解析任何类似这样的列表):Python 如何解析此列表中的元素?,python,regex,Python,Regex,我有一个列表要解析(但我正在寻找一种通用的方法来解析任何类似这样的列表): dev libs/icu-63.1-r1 alpha amd64 arm64 ia64 ppc ppc64 x86 hppa s390 开发libs/icu-layoutex-63.1 alpha amd64 ia64 ppc ppc64 x86 hppa sparc dev lang/perl-5.28-r1 s390 虚拟/ruby_gems-0.3_pre24 amd64 x86 这似乎有时会失败,因为它尝试解析架
dev libs/icu-63.1-r1 alpha amd64 arm64 ia64 ppc ppc64 x86 hppa s390
开发libs/icu-layoutex-63.1 alpha amd64 ia64 ppc ppc64 x86 hppa sparc
dev lang/perl-5.28-r1 s390
虚拟/ruby_gems-0.3_pre24 amd64 x86
这似乎有时会失败,因为它尝试解析架构列表,比如从alpha
开始,直到行末,但我真的想忽略包版本后的所有内容,但在版本后保留空间存在的可能性
我的代码如下:(打印东西只是为了调试)
用于args.list中的行:
打印(行)
package_category=re.search(r’(?这就是你想要的:
(?P<category>\w+(?:-\w+)?)/(?P<name>[a-z]+(?:[-_][a-z]+)?)-(?P<version>\S+)
我运行了你的代码,它给了我你所期望的。你在哪里失败了?为什么不列出一个包含/
之前所有字符串的package\u category
列表和一个包含/
之后但第二次出现-
之前所有字符串的package\u name
列表以及一个package\u versio列表n
包含第二次出现-
之后和空之前的所有字符串。
@Aaron_ab我已经编辑了OP以包含错误I hithmm,regex本身可以工作,但是当我尝试将结果分配到像这样的命令中时(为了进一步使用):packages.append({“category”:res.group('category')),“name”:res.group('name'),“version”:res.group('version')})
我遇到错误AttributeError:'NoneType'对象没有属性'group'
如果它已经在组中,为什么要再次尝试执行搜索?:(@MishaLavrov:我不太懂python,但我认为字典中没有append方法。你如何使用它?你是在for循环内部还是外部进行赋值?在for循环内部,只需添加包[“category”]=res.group('category')
,名称和版本相同。我刚刚尝试过,效果很好。
(?P<category>\w+(?:-\w+)?)/(?P<name>[a-z]+(?:[-_][a-z]+)?)-(?P<version>\S+)
(?<category> # named group category
\w+ # 1 or more word character
(?:-\w+)? # optional, a dash then 1 or more word character
) # end group
/ # a slash
(?<name> # named group name
[a-z]+ # 1 or more alpha
(?:[-_][a-z]+)? # optional, dash or underscore and 1 or more alpha
) # end group
- # a dash
(?<version> # named group version
\S+ # 1 or more non space character
) # end group
import re
list = [
'dev-libs/icu-63.1-r1 alpha amd64 arm arm64 ia64 ppc ppc64 x86 hppa s390 ',
'dev-libs/icu-layoutex-63.1 alpha amd64 ia64 ppc ppc64 x86 hppa sparc',
'dev-lang/perl-5.28-r1 s390',
'virtual/ruby_gems-0.3_pre24 amd64 x86'
]
for line in list:
res = re.search(r'(?P<category>\w+(?:-\w+)?)/(?P<name>[a-z]+(?:[-_][a-z]+)?)-(?P<version>\S+)', line)
print "cat: ",res.group('category'),"\t name: ",res.group('name'), "\t\tversion: ",res.group('version')
cat: dev-libs name: icu version: 63.1-r1
cat: dev-libs name: icu-layoutex version: 63.1
cat: dev-lang name: perl version: 5.28-r1
cat: virtual name: ruby_gems version: 0.3_pre24