2016-08-04 2 views
1

У меня есть питон файл какразборе питон файл с повторной

test.py 

import os 
class test(): 

    def __init__(self): 
     pass 

    def add(num1, num2): 
     return num1+num2 

Я читал этот файл в строку, как:

with open('test.py', 'r') as myfile: 
    data=myfile.read() 

print data 

Теперь мои данные содержит строку со всеми линиями и новыми линий. Мне нужно найти строки с началом класса и def.

, например:

мне нужно вывод на печать, как:

class test(): 
def __init__(self): 
def add(num1, num2): 

Как я могу обработать это с помощью регулярных выражений?

+0

Что вы имеете в виду 'process'? –

+0

Мне нужно обработать строковые данные, чтобы получить результат, как показано – sam

+0

@ GáborErdős Я считаю, что он означает Regex. OP: Какова ваша мотивация? –

ответ

2

Если вы хотите следовать регулярное выражение подход, использовать

re.findall(r'(?m)^[ \t]*((?:class|def)[ \t].*)', data) 

или

re.findall(r'^[ \t]*((?:class|def)[ \t].*)', data, flags=re.M) 

См regex demo

Дело в том, что вы должны использовать ^ в начале линии якоря (следовательно, (?m) на флаг старта или re.M необходимы), то вы совпадают горизонтальные пробельные (с [ \t]), то либо class или def(?:class|def)), а затем снова пробел или tab, а затем символы 0+, отличные от новой строки (.*).

Если вы планируете также обрабатывать пробелы Unicode, вам необходимо заменить [ \t] на [^\S\r\n\f\v] (и использовать флаг re.UNICODE).

Python demo:

import re 
p = re.compile(r'^[ \t]*((?:class|def)[ \t].*)', re.MULTILINE) 
s = "test.py \n\nimport os\nclass test():\n\n def __init__(self):\n  pass\n\n def add(num1, num2):\n  return num1+num2" 
print(p.findall(s)) 
# => ['class test():', 'def __init__(self):', 'def add(num1, num2):'] 
+0

Не можете ли вы просто использовать' \ s' для пробелов? –

+0

Нет, '\ s' соответствует новой строке, но' data' - это весь файл, содержащий новые строки. Возможно, это нормально, но у меня нет дополнительных входных данных для его проверки. –

+0

Ну, я думаю, вы могли бы использовать '\ s +?' Для не-жадного соответствия и '^ ... $', чтобы ограничить его одной строкой. –

2

Так что если вам нужно найти все строки def и class, гораздо легче избежать регулярных выражений.

Читает все содержимое файла здесь

with open('test.py', 'r') as myfile: 
    data=myfile.read() 

print data 

Почему вы не просто найти ответ прямо там?

with open('test.py', 'r') as myfile: 
    for line in myfile: 
     stripped = line.strip() # get rid of spaces left and right 
     if stripped.startswith('def') or stripped.startswith('class'): 
      print(line) 

Для работы с целой строки, как вы просили:

import re 
with open('test.py', 'r') as myfile: 
    data = myfile.read() 

print(data) 

print(re.findall("class.+\n|def.+\n",data)) 

Как вы можете видеть из комментариев это будет соответствовать «» определяемом в бла-бла», а также. Так что лучше использовать

print(re.findall("class .+\n|def .+\n",data)) 
+0

Это не будет работать с намеченными линиями. –

+0

Я не хочу искать по строкам. Мое намерение состоит в поиске внутри полной строки файла. – sam

+0

Я исправил работу с отступом линии –

1
with open('test.py', 'r') as myfile: 
    data=myfile.read().split('\n') 
    for line in data: 
     if re.search("(\s+)?class ", line) or re.search("^\s+def ", line): 
      print line 
Смежные вопросы