2014-01-05 3 views
0

Мне нужно извлечь строку из каталога, как это:Python регулярное выражение поиска назад

my_new_string = "C:\\Users\\User\\code\\Python\\final\\mega_1237665428090192022_cts.ascii" 
ID = '1237665428090192022' 
m = re.match(r'.*(\b\w+%s)(?<!.{%d})' % (ID, -1), my_new_string) 
if m: print m.group(1) 

Мне нужно извлечь «мега» из приведенного выше my_new_string. На данный момент выше всего получается mega_1237665428090192022, так как я могу заставить его игнорировать идентификационный номер?

Если честно, я не понимаю, как эти выражения работают, даже после консультации с документацией. Что делает r'? И как работает ?<!.{%d}?

Редактировать: Спасибо, ребята!

+0

Что такое '' (? eyquem

+0

'(? kilogic

ответ

2

Существует несколько способов сделать это, хотя я не уверен, что вы обязательно нуждаетесь в регулярном выражении здесь. Вот несколько вариантов:

>>> import os.path 
>>> my_new_string = "C:\\Users\\User\\code\\Python\\final\\mega_1237665428090192022_cts.ascii" 
>>> os.path.basename(my_new_string) 
'mega_1237665428090192022_cts.ascii' 
>>> basename = os.path.basename(my_new_string) 
>>> basename.split('_')[0] 
'mega' 
>>> import re 
>>> re.match(r'[A-Za-z]+', basename).group() 
'mega' 

Я не думаю, что вы ищете отрицательное опережения утверждение или отрицательное утверждение с просмотром назад. Во всяком случае, вы хотите соответствовать, если числа DO следуют. Например, что-то вроде этого:

>>> re.match(r'.*?(?=[_\d])', basename).group() 
'mega' 

г просто делает сырую строку (так что вам не нужно постоянно бежать обратную косую черту, например).

1
>>> m = re.match(r'.*\b(\w+)_(%s)(?<!.{%d})' % (ID, -1), my_new_string) 
>>> m.groups() 
('mega', '1237665428090192022') 

>>> m.group(1) 
'mega' 
Смежные вопросы