2014-01-08 5 views
2

Я нахожу линию из текста с 10 строками.Python 3 удалить пустой список

desc = re.findall(r'@description (.*)', comment.strip()) 

Что происходит, она возвращает @description, но он также имеет 9 пустых списков.

print(desc) 

возвращается:

[] 
[] 
[] 
[] 
[] 
[] 
[] 
[] 
['the desc is here'] 
[] 

Так как же избавиться от этих пустых [] и сделать desc=['the desc is here']?


обновление

Я попробовал фильтр списка и все тот же возвращение

Комментарий содержит:

/** 
* @param string username required the username of the registering user 
* @param string password required 
* @param string first_name required 
* @param string last_name required 
* @param string email  required 
* @package authentication 
* @info user registration 
* @description register a new user into the groupjump platform 
*/ 

обновление

комментарий полная строка, поэтому я разделил его, как этого, так что я могу читать построчно

comments = route['comment'] 
comments = list(filter(None, comments.split('\n'))) 

кодовую

#!/usr/bin/env python3 

import re 

routes = [] 
description = '' 
with open('troutes.php', 'r') as f: 
    current_comment = '' 
    in_comment = False 
    for line in f: 
     line = line.lstrip() 
     if line.startswith('/**'): 
      in_comment = True 

     if in_comment: 
      current_comment += line 

     if line.startswith('*/'): 
      in_comment = False 

     if line.startswith('Route::'): 
      matches = re.search(r"Route::([A-Z]+)\('(.*)', '(.*)'\);", line) 
      groups = matches.groups() 
      routes.append({ 
       'comment': current_comment, 
       'method': groups[0], 
       'path': groups[1], 
       'handler': groups[2], 
      }); 
      current_comment = '' # reset the comment 

for route in routes: 

    # get comments 
    comments = route['comment'] 
    comments = list(filter(None, comments.split('\n'))) 

    for comment in comments: 
    params = re.findall(r'@param (.*)', comment.strip()) 
    object = re.findall(r'@package (.*)', comment.strip()) 
    info = re.findall(r'@info (.*)', comment.strip()) 
    desc = re.search(r'@description (.*)', comment.strip()) 

    print(comment[15:]) 

данные считываются:

<?php 
/** 
* @param string username required the username of the registering user 
* @param string password required 
* @param string first_name required 
* @param string last_name required 
* @param string email  required 
* @package authentication 
* @info user registration 
* @description register a new user into the groupjump platform 
*/ 
Route::POST('v3/register', '[email protected]'); 

/** 
* @param string username required the username of the registering user 
* @param string password required 
*/ 
Route::GET('v3/login', '[email protected]'); 
+0

Что есть в 'комментарии'? – thefourtheye

+0

@ thefourtheye обновил мой вопрос. – majidarif

+1

Я получаю только, '['зарегистрировать нового пользователя на платформе groupjump']' – thefourtheye

ответ

0

Кажется, что вы e соответствие шаблону по строкам. Почему вы не соглашаетесь со всем комментарием?

>>> comment = '''/** 
... * @param string username required the username of the registering user 
... * @param string password required 
... * @param string first_name required 
... * @param string last_name required 
... * @param string email  required 
... * @package authentication 
... * @info user registration 
... * @description register a new user into the groupjump platform 
... */''' 
>>> 
>>> import re 
>>> desc = re.findall(r'@description (.*)', comment) 
>>> desc 
['register a new user into the groupjump platform'] 
+0

Не похоже на отображение действительно. Его просто сделать переменную 'desc = desc' – majidarif

+0

@majimboo, Не могли бы вы показать полный код? – falsetru

+0

@majimboo, я обновил ответ. – falsetru

1

Условием для одного списка просто:

if desc: 
    print(desc) 

Это сокращенный вариант:

if len(desc) > 0: 
    print(desc) 

Для списка списков это:

desc = [d for d in desc if d] 

Чтобы получить только строку, выполните следующие действия:

if desc: 
    print(desc[0]) 
+0

Нет, в другом списке все еще есть – majidarif

+0

@majimboo См. Мое редактирование. – BartoszKP

0

Вы можете фильтровать список с пустой строкой из списка списков со списком пониманием:

desc = re.findall(r'@description (.*)', comment.strip()) 
desc = [d for d in desc if len(d[0]) > 0] 

Другим решением является для печати элемента, только если первый элемент содержит что-то:

desc = re.findall(r'@description (.*)', comment.strip()) 
for d in desc: 
    if len(d) > 0 and d[0]: # check if there's a first element and if this element isn't empty 
      print d 
0

Для того, чтобы ваш код работал, вам нужно работать с одной строкой, если у вас есть 10 строк, выполните следующие действия:

joined = "\n".join(lines) 
for i in re.findall(r'@description (.*)', joined): 
    print (i) 
Смежные вопросы