Извлечение списка строк из файла - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно извлечь 3 строки из файла, как показано ниже:

Мне нужно извлечь только 3 строки перед ключевым словом: ">> For"

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

import re
import sys

contents = "JLYLFPMKKLZDSRLBTEKH                                        KMZMGQNLLMAETSMCUFLI                                         KXKEOLJJKYCRQKASDJG                    J                    LYLFPMKKLZDSRLBTEKH                    K                    MZMGQNLLMAETSMCUFLI                    L                    KXKEOLJJKYCRQKASDJGJ                                        LYLFPMKKLZDSRLBTEKHK                                        MZMGQNLLMAETSMCUFLIL                                        KXKEOLJJKYCRQKASDJGJ                                        LYLFPMKKLZDSRLBTEKHK                                        MZMGQNLLMAETSMCUFLIL                    >> For"

m = re.match(r'(.*)[A-Z]{20}\s{40}(.*)\s{20}>> For', contents)

if m:
    print m.group(1)

Ожидаемый результат для указанного выше файла:

['KXKEOLJJKYCRQKASDJGJ', 'LYLFPMKKLZDSRLBTEKHK', 'MZMGQNLLMAETSMCUFLIL']

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Вы можете использовать это регулярное выражение,

([A-Z]{20})\s+([A-Z]{20})\s+([A-Z]{20})\s+>>\s*For

и захватывать group1, group2 и group3

Demo

Примеры кодов питона,

import re
contents = 'JLYLFPMKKLZDSRLBTEKH                                        KMZMGQNLLMAETSMCUFLI                                         KXKEOLJJKYCRQKASDJG                    J                    LYLFPMKKLZDSRLBTEKH                    K                    MZMGQNLLMAETSMCUFLI                    L                    KXKEOLJJKYCRQKASDJGJ                                        LYLFPMKKLZDSRLBTEKHK                                        MZMGQNLLMAETSMCUFLIL                                        KXKEOLJJKYCRQKASDJGJ                                        LYLFPMKKLZDSRLBTEKHK                                        MZMGQNLLMAETSMCUFLIL                    >> For'
m = re.match(r'.*([A-Z]{20})\s+([A-Z]{20})\s+([A-Z]{20})\s+>>\s*For', contents)
if m:
 print(m.group(1))
 print(m.group(2))
 print(m.group(3))

Какие печатные издания,

KXKEOLJJKYCRQKASDJGJ
LYLFPMKKLZDSRLBTEKHK
MZMGQNLLMAETSMCUFLIL
0 голосов
/ 04 декабря 2018

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

contents = "JLYLFPMKKLZDSRLBTEKH                                        KMZMGQNLLMAETSMCUFLI                                         KXKEOLJJKYCRQKASDJG                    J                    LYLFPMKKLZDSRLBTEKH                    K                    MZMGQNLLMAETSMCUFLI                    L                    KXKEOLJJKYCRQKASDJGJ                                        LYLFPMKKLZDSRLBTEKHK                                        MZMGQNLLMAETSMCUFLIL                                        KXKEOLJJKYCRQKASDJGJ                                        LYLFPMKKLZDSRLBTEKHK                                        MZMGQNLLMAETSMCUFLIL                    >> For"

toks = contents.split()
for i in range(len(toks)-1):
    if toks[i]==">>" and toks[i+1]=="For":
        print(toks[i-3:i])
        break

печатает:

['KXKEOLJJKYCRQKASDJGJ', 'LYLFPMKKLZDSRLBTEKHK', 'MZMGQNLLMAETSMCUFLIL']
0 голосов
/ 04 декабря 2018
re.findall('(\w{20}\s+\w{20}\s+\w{20}\s+)>> For', x)[0].split()

Это должно вернуть то, что вы ищете:

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