在Python中创建正则表达式

时间:2009-12-13 18:26:21

标签: python regex expression

我正在尝试创建从以下部分文本中过滤的正则表达式:

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缺失)

非常感谢。

3 个答案:

答案 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)

如果您想要一件事,请不要使用捕获组。

相关问题