2015-08-06 4 views
2

Хотите пройти через строки в файле и захватить определенные части из них.python regex для захвата определенных частей линии

Линии выглядеть следующим образом "2584 \ tM108 \ Tk: 14%" "2585 \ tM108 \ Tk: 14% \ Tn: 10%"

Я написал следующие выражения, но они, кажется, не сбив с толку ... Во-первых, я хочу захватить M10 * и K и соединить их вместе, беря только первую запись после M10 * (в приведенном выше примере K).

Mutation = re.sub(r'.*\t(.*)\t.*:(.*)%.*', r'\1\2', line) 

Я хочу Мутация = M108K

Во-вторых, я хочу, чтобы захватить процент без символа%

Percentage = re.sub(r'.*\t.*\t.*:(.*)%.*', r'\1', line) 

Я хочу, чтобы в процентах = 14

Не очень практиковали пишут выражения, они действительно не работают и неэффективны. Любая помощь в их исправлении/оптимизации.

+1

Интересно, почему те, кто отвечает редко upvote вопросы они ответить. +1 от меня, и это мой намек: не принимайте ленивое соответствие как должное, а также посмотрите на классы с отрицанием символов. Например. '[^ \ t]' соответствует любому символу, кроме закладки. –

+1

@stribizhev Я не сторонник этого вопроса. ya '. *?' будет заменен на '[^ \ t]', но '. *?' более понятно .. –

ответ

3

Я бы сделал все это в одном регулярном выражении. .* жадный, который ест всех персонажей как можно больше. Таким образом, вам нужно сделать это, чтобы сделать неживое соответствие, добавив квант ? рядом с *.

>>> import re 
>>> s = "2584\tM108\tK:14%" "2585\tM108\tK:14%\tN:10%" 
>>> re.sub(r'^.*?\t(.*?)\t(.*?):(.*?)%.*', r'\1\2 \3', s) 
'M108K 14' 

или

>>> mutation,percentage = re.sub(r'^.*?\t(.*?)\t(.*?):(.*?)%.*', r'\1\2 \3', s).split() 
>>> mutation 
'M108K' 
>>> percentage 
'14' 
+1

Или 'mutation, percent = ...'. – TigerhawkT3

+0

Абсолютные звезды, оба из вас - большое вам спасибо. – user3234810

+0

ya, сделано ........... –

Смежные вопросы