我正在尝试创建从以下部分文本中过滤的正则表达式:
amd64 build of software 1:0.98.10-0.2svn20090909 in archive
我想要提取的是:
software 1:0.98.10-0.2svn20090909
我该怎么做?我一直在努力,这就是我到目前为止所做的:
p = re.compile('([a-zA-Z0-9\-\+\.]+)\ ([0-9\:\.\-]+)')
iterator = p.finditer("amd64 build of software 1:0.98.10-0.2svn20090909 in archive")
for match in iterator:
print match.group()
结果:
software 1:0.98.10-0.2
(svn20090909
缺失)
非常感谢。
答案 0 :(得分:3)
这将有效:
p = re.compile(r'([a-zA-Z0-9\-\+\.]+)\ ([0-9][0-9a-zA-Z\:\.\-]+)')
iterator = p.finditer("amd64 build of dvdrip software 1:0.98.10-0.2svn20090909 in archive")
for match in iterator:
print match.group()
# Prints: software 1:0.98.10-0.2svn20090909
通过允许捕获的部分包含字母,同时仍然坚持以数字开头。
如果没有看到它需要匹配的所有其他字符串,我无法确定这是否足够好。
答案 1 :(得分:3)
如果你有一致的行,那么,如果每个条目都在一行上,并且你想要的第一个单词总是在数字部分之前(1:0.98 ...部分)你不需要正则表达式。试试这个:
>>> s = 'amd64 build of software 1:0.98.10-0.2svn20090909 in archive'
>>> match = [s.split()[3], s.split()[4]]
>>> print match
['software', '1:0.98.10-0.2svn20090909']
>>> # alternatively
>>> match = s.split()[3:5] # for same result
这是做什么的:它首先在空格处分割行s
(使用字符串方法split()
)并选择结果列表的第四和第五个元素;两者都存储在变量match
。
同样,这仅适用于每行有一个条目且'software'
部分始终位于1:0.98.10-0.2svn20090909
部分之前的情况。
当我可以使用拆分列表时,我经常会避免使用regexp。如果解析变成了噩梦,我使用pyparsing。
答案 2 :(得分:0)
如果您想要一件事,请不要使用捕获组。