Я нашел .Net Профилировщик Памяти очень хорошая справка при нахождении утечек памяти в.Net. Это не является свободным как Microsoft CLR Profiler, но является быстрее и главным, по-моему.
Как насчет понимания списка?
In [5]: versions = [m.group(1) for m in [regex.match(lib) for lib in libs] if m]
In [6]: versions
Out[6]: ['3.3.1', '3.2.0']
Еще один однострочник. чтобы показать другие способы (я также немного почистил регулярное выражение):
regex = re.compile(r'^libIce\.so\.([0-9]+\.[0-9]+\.[0-9]+)$')
sum(map(regex.findall, libs), [])
Но учтите, что ваша исходная версия более читабельна, чем все предложения. Стоит ли менять?
Вы могли бы сделать это:
versions = [m.group(1) for m in [regex.match(l) for l in libs] if m]
Я не думаю, что это очень удобно для чтения ...
Может быть, это прояснить в два этапа:
matches = [regex.match(l) for l in line]
versions = [m.group(1) for m in matches if m]
Нет ничего не питонического в использовании стандартного цикла for. Однако вы можете использовать функцию map () для создания нового списка на основе результатов выполнения функции для каждого элемента в списке.
вам действительно не нужно беспокоиться о регулярном выражении для вашего простого случая
>>> libs = ['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
>>> libs
['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
>>> for i in libs:
... print i.split("so.")
...
['libIce.', '33']
['libIce.', '3.3.1']
['libIce.', '32']
['libIce.', '3.2.0']
>>> for i in libs:
... print i.split("so.")[-1]
...
33
3.3.1
32
3.2.0
>>>
Выполните дополнительную проверку, чтобы получить те, которые с " точки ».
Как насчет этого:
import re
def matches(regexp, list):
'Regexp, [str] -> Iterable(Match or None)'
return (regexp.match(s) for s in list)
libs = ['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
regexp = re.compile('libIce.so\.([0-9]+\.[0-9]+\.[0-9]+)')
versions = [m.group(1) for m in matches(regexp, libs) if m is not None]
>>> print versions
['3.3.1', '3.2.0']
Один из способов, который я мог придумать, - это объединить "карту" и понимание списка.
Решение выглядит следующим образом:
import re
libs = ['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
versions = []
regex = re.compile('libIce.so\.([0-9]+\.[0-9]+\.[0-9]+)')
def match(s):
m = regex.match(s)
if m:
return m.group(1)
versions = [x for x in map(match,libs) if x]