使用RE检索ID

时间:2010-06-10 13:54:21

标签: python regex

我正在尝试使用RE来匹配更改的ID并将其解压缩。我有点麻烦让它工作。字符串是:

m = 'Some Text That exists version 1.0.41.476 Fri Jun  4 16:50:56 EDT 2010'

到目前为止我尝试过的代码是:

r = re.compile(r'(s*\s*)(\S+)')
m = m.match(r)

任何人都可以帮助提取此字符串。

由于

3 个答案:

答案 0 :(得分:4)

>>> m = 'Some Text That exists version 1.0.41.476 Fri Jun  4 16:50:56 EDT 2010'
>>> import re
>>> re.search(r'version (\S+)', m).group(1)
('1.0.41.476',)

答案 1 :(得分:2)

以下是基于RE和基于字符串的版本:

import re

def bystr(text):
    words = text.split()
    index = words.index('version') + 1
    return words[index]

def byre(text, there=re.compile(r'version\s+(\S+)')):
    return there.search(text).group(1)

m = 'Some Text That exists version 1.0.41.476 Fri Jun  4 16:50:56 EDT 2010'

if __name__ == '__main__':
    print bystr(m)
    print byre(m)

(作为主脚本运行以确认它们返回相同的结果 - 一个字符串,而不是现有答案所特有的元组),这里是每个的时间(在我的慢速笔记本电脑上):

$ python -mtimeit -s'import are' 'are.bystr(are.m)'
100000 loops, best of 3: 4.29 usec per loop
$ python -mtimeit -s'import are' 'are.byre(are.m)'
100000 loops, best of 3: 3.25 usec per loop

虽然RE在Python社区中经常声名狼借,但即使是这个简单的例子也表明,在适当的情况下,它们通常比简单的字符串操作更快 - 在这种情况下,RE版本只需要大约3/4字符串版本所用的时间。

答案 2 :(得分:0)

您不一定要使用正则表达式来提取子字符串。

def get_version_number(text):
    """Assumes that the word 'version' appears before the version number in the 
    text."""
    words = text.split()
    index = words.index('version') + 1
    return words[index]

if __name__ == '__main__':
    m = 'Some Text That exists version 1.0.41.476 Fri Jun  4 16:50:56 EDT 2010'

    print get_version_number(m)
    print repr(get_version_number(m))