2013-06-29 7 views
0

Здравствуйте, я пытаюсь разобрать скрипт, содержащий пути к файлам, подобным приведенным ниже. Я хотел бы проанализировать файл с помощью регулярных выражений и сохранить данные в строке с разделом «\ n» между файлами. Пример файла приведен ниже.chaining regular expression in python

SAMPLE FILE: ('#' is a comment would like to keep commented out) 
    add file -tls "../path1/path2/path3/example_1.edf" 
    add file -tls "../path1/path2/path3/example_1.v" 
    add file -tls "../path1/path2/path3/exa_4mple_1.sv" 
    add file -tls "../path1/path2/path3/example_1.vh"   
    #add file -tls "../path1/path2/path3/exa_0mple_1.vhd" 

    SAMPLE OUTPUT: (this example excludes the '\n' character) 
    example_1.v 
    exa_4mple_1.sv 
    example_1.vh 
    #exa_0mple_1.vhd 

Как я могу построить расширение 're', чтобы оно включало только указанные выше расширения и исключало других? Мне также интересно, можно ли поймать «#» для прокомментированных строк и добавить имя файла в «#». не нужны

-Desired function: 
    for match in re.finditer(r'/([A-Za-z0-9_]+\..+)"', contents): 
     mylist.append(match.group(1)) 

    -Working Code: (tested on the '.v' file case) 
    re.finditer(r'/([A-Za-z0-9_]+\.v)"', contents) 

ответ

1

Регулярные выражения:

>>> import os 
>>> L = [ 
... "/path1/path2/path3/example_1.edf", 
... "/path1/path2/path3/example_1.v", 
... "/path1/path2/path3/exa_4mple_1.sv", 
... "/path1/path2/path3/example_1.vh" ] 
>>> for mypath in L: 
...  if mypath.split('.')[-1] in ('v', 'sv', 'vh'): 
...    print os.path.split(mypath)[1] 
... 
example_1.v 
exa_4mple_1.sv 
example_1.vh 

Или как список понимания:

>>> [os.path.split(mypath)[1] 
... for mypath in L 
... if mypath.split('.')[-1] in ('v', 'sv', 'vh')] 
['example_1.v', 'exa_4mple_1.sv', 'example_1.vh'] 
+0

@MattCarlis Добро пожаловать :) – TerryA

+0

Почему де-прием :( – TerryA

+0

Возможно, я неправильно сформулировал свой вопрос. Содержимое переменной было использовано в «contents = file_obj.read()» на очень большом скрипте, содержащем все виды мусора внутри, смешанные с файлами, путь которых меняется. Я смущен тем, где произошло форматирование пути. – Matt

1

Является ли это то, что вы хотите? :

import re 

contents = ''' 
add file -tls "../path1/path2/path3/example_1.edf" 
add file -tls "../path1/path2/path3/example_1.v" 
add file -tls "../path1/path2/path3/exa_4mple_1.sv"  
add file -tls "../path1/path2/path3/example_1.vh"  
#add file -tls "../path1/path2/path3/exa_0mple_1.vhd" 
''' 

print contents 

pat = "^(#?)add file.+?\"\.\./(?:\w+/)*(\w+?\.\w*v\w*)\"\s*$" 

gen = (''.join(mat.groups()) 
     for mat in re.finditer(pat,contents,re.MULTILINE)) 

print '\n'.join(gen) 

Шаблон позволяет улавливать пути с расширениями, содержащих букву «V», что это WAHT я понял из вашего вопроса.
Я также поставил строку add file в качестве критерия ловли, согласно вашему примеру.
Я использовал \w в шаблоне.
С этим рисунком все пути должны начинаться с ../
Если все эти характеристики не адаптированы к вашему случаю, мы изменим то, что нужно изменить.

Обратите внимание, что я положил \s* в конце рисунка, если в строке есть пробелы в строке.

+0

Are вы уверены, что это рабочий код? Почему-то я получаю ошибки! – Matt

+0

Какие ошибки? Если вы не скажете их, я не могу догадаться. - Вы используете Python 3? – eyquem

+0

Я использую 2.7.5. Я получаю сообщение об ошибке на матке в строке re.finditer (pat, contents, re.MULTILINE) '). Он выделяет конец (') после MULTILINE). – Matt