2012-03-20 2 views
0

из строки:простой регулярное выражение случай питона

l="\tsome string in line 1\n\tcmd: DIR @1332243996 (2012.03.20 12:46:36) state op:29 cfg:0\n\tline 3 some other string" 

я хочу, чтобы извлечь "DIR", поэтому я создал эту регулярное выражение:

j = re.search(r'cmd: \w+', l) 

, но когда я делаю:

print j.group() 

i получено:

cmd: DIR 

Что я должен сделать, чтобы получить только "DIR", а не с "ЦМД:" например:

print j.group() 
DIR 

ТНХ для всех отвечает

ответ

5

Вы должны захватить группу DIR в своем регулярном выражении:

j = re.search(r'cmd: (\w+)', l) 

Затем ссылаться на него при получении:

print j.group(1) 
+0

Ну, но если DIR - это каталог (обычно что-то вроде «some/directory», а не только один «каталог»), он не будет соответствовать. –

+0

@ Dr.Kameleon Это будет соответствовать косой чертой, которая, как представляется, запрашивается. – Marcin

4

Сделать это позитивный взгляд за утверждение

j = re.search(r'(?<=cmd:)\w+', l) 

Посмотреть here on Regexr

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

+0

Не дает ли CMD, а не то, что следует за ним? – Marcin

+1

посмотреть _behind_ assertation – katrielalex

+1

@Marcin no. Символы '? <=' В начале группы сообщают движку регулярных выражений, что это положительный lookbehind; то есть, что матч должен быть _preceded_ этой группой. – katrielalex

4

Вы должны поместить группу (то есть, скобки) вокруг той части, которую вы хотите захватить:

j = re.search(r'cmd: (\w+)', l) 
k = re.search(r'cmd:\s*(\w+)', l) 
print j.group(1) 

Вы можете предпочесть использовать версию k, который обрабатывает переменное количество пробелов между " cmd: "и что дальше.

+0

Ну, но если DIR - это каталог (обычно это что-то вроде «some/directory», а не только один «каталог»), он не будет соответствовать. –

+0

@ Dr.Kameleon О чем ты говоришь? – Marcin

+0

Я имею в виду, что это не соответствует чему-то вроде 'cmd: another/dir'. Разве не возможно, что DIR, к которому относится OP, является «каталогом»? В этом случае, я полагаю, мы должны также учитывать символы '/' и '\' при сопоставлении ... –

-1

RE-RE-FIXED

Вот ваш Regex: cmd:\s([\w//\\]+)\[email protected][0-9]+\s


Подсказка: он соответствует cmd: somedir @12312312, а также cmd: another/dir @123123

+1

Вы прочитали вопрос? Это не делает то, что он просит, и не соблюдает требование, подразумеваемое в вопросе. –

+0

@ sr2222 Ну ... моя ошибка ... Я только что исправил это ... (надеюсь) –

+0

Выглядит лучше. ип-1. –

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