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