Python регулярное выражение игнорировать пустые строки - PullRequest
2 голосов
/ 15 февраля 2020

У меня есть данные со следующей структурой:

[TimingPoints]
21082,410.958904109589,4,3,1,60,1,0
21082,-250,4,3,1,100,0,0
22725,-142.857142857143,4,3,1,100,0,0
23547,-166.666666666667,4,3,1,100,0,0

24369,-333.333333333335,4,3,1,100,0,0
27657,-200.000000000001,4,3,1,100,0,0
29301,-142.857142857143,4,3,1,100,0,0
30123,-166.666666666667,4,3,1,100,0,0
30945,-250,4,3,1,100,0,0

32588,-166.666666666667,4,3,1,100,0,0
34232,-250,4,3,1,100,0,0
35876,-142.857142857143,4,3,1,100,0,0
36698,-166.666666666667,4,3,1,100,0,0
37520,-250,4,3,1,100,0,0
42451,-142.857142857143,4,3,1,100,0,0


[HitObjects]
256,192,17794,12,0,20876,0:0:0:0:
159,96,21082,6,0,B|204:120|204:120|254:103|254:103|305:130|355:102,1,210
409,27,22725,2,0,P|446:96|405:179,1,171.499994766236
269,284,23547,2,0,B|317:250|324:193|324:193|328:220|350:236,1,146.999995513916

Я хотел бы прочитать все строки в [TimingPoints] перед [HitObjects] в списке. Пустые строки следует игнорировать. Таким образом, окончательный список должен содержать:

21082,410.958904109589,4,3,1,60,1,0
21082,-250,4,3,1,100,0,0
22725,-142.857142857143,4,3,1,100,0,0
23547,-166.666666666667,4,3,1,100,0,0
24369,-333.333333333335,4,3,1,100,0,0
27657,-200.000000000001,4,3,1,100,0,0
29301,-142.857142857143,4,3,1,100,0,0
30123,-166.666666666667,4,3,1,100,0,0
30945,-250,4,3,1,100,0,0
32588,-166.666666666667,4,3,1,100,0,0
34232,-250,4,3,1,100,0,0
35876,-142.857142857143,4,3,1,100,0,0
36698,-166.666666666667,4,3,1,100,0,0
37520,-250,4,3,1,100,0,0
42451,-142.857142857143,4,3,1,100,0,0

Я пробовал его с помощью следующего шаблона регулярных выражений: \[TimingPoints\]((.|\n)*)\[HitObjects], но он не игнорирует пустые строки. Как я могу сопоставить строки, чтобы получить то, что описано выше? Также как я могу загрузить все совпадающие строки в списке с помощью python?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

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

1) Считайте файл в list и удалите все пробелы (включая символы новой строки), и опустите строку, если она пуста
2). найдите «[HitObjects]» и обрежьте из списка вместе с заголовком
3) Готово

Пример кода:

path = './timing.txt'

with open(path, 'r') as f:
    text = [i.strip() for i in f if i.strip()]

# Keep only rows between the headers of interest.
result = text[text.index('[TimingPoints]')+1:text.index('[HitObjects]')]

Вывод:

['21082,410.958904109589,4,3,1,60,1,0',
 '21082,-250,4,3,1,100,0,0',
 '22725,-142.857142857143,4,3,1,100,0,0',
 '23547,-166.666666666667,4,3,1,100,0,0',
 '24369,-333.333333333335,4,3,1,100,0,0',
 '27657,-200.000000000001,4,3,1,100,0,0',
 '29301,-142.857142857143,4,3,1,100,0,0',
 '30123,-166.666666666667,4,3,1,100,0,0',
 '30945,-250,4,3,1,100,0,0',
 '32588,-166.666666666667,4,3,1,100,0,0',
 '34232,-250,4,3,1,100,0,0',
 '35876,-142.857142857143,4,3,1,100,0,0',
 '36698,-166.666666666667,4,3,1,100,0,0',
 '37520,-250,4,3,1,100,0,0',
 '42451,-142.857142857143,4,3,1,100,0,0']
1 голос
/ 15 февраля 2020

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

#!/usr/local/cpython-3.1/bin/python3  

# Works on CPython 3.1 through 3.9  

"""Keep lines between [TimingPoints] and [HitObjects], elliding empty lines."""  


def main():  
    """Read input and write actual-output."""  
    display = False                            
    with open('input', 'r') as infile, open('actual-output', 'w') as outfile:  
        for line in infile:                                                    
            line_sans_n = line.rstrip('\n')  
            if not line_sans_n:              
                # Skip blank lines  
                continue            
            if line_sans_n == '[HitObjects]':  
                display = False                
            if display:           
                print(line_sans_n, file=outfile)  
            if line_sans_n == '[TimingPoints]':   
                display = True

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...