Извлечь все строки между начальным маркером и конечным маркером - PullRequest
1 голос
/ 11 декабря 2019

У меня есть строка из одной строки, прочитанная из текстового файла (файл содержит только эту строку) в следующем формате:

[["abstract", "common", "reference", "вводная информация","мотивация"], ["реальный", "день", "ночь", "двадцать", "кровь", "грузовик", "майор", "корабль", "самолет"], ["оружие", "оружие""," ядерный "," револьвер "], [" роза "," принцесса "," цветок "," красота "," подсолнух "," солдат "," воображаемый "," жасмин "], [" ткань ","рубашка", "джинсы", "брюка"]]

Я хочу получить весь текстовый контент между начальным маркером = ["и конечным маркером ="]

, поэтому мой желаемый вывод долженбыть (с новой строкой):

«аннотация», «общий», «ссылка», «введение», «мотивация»

«реальный», «день», «ночь»,"двадцать", "кровь", "грузовик", "майор", "корабль", "самолет"

"оружие", "пушки", "ядерный", "револьвер"

"роза", "принцесса", "цветок", "красота", "подсолнух", "солдат", "воображаемый", "жасмин"

"ткань", "рубашка", "джинсы", "брюк "

Я написал следующееКодекс:

def fileRead(fpath):

    f = open(fpath, "r")

    for s in f:

            start = s.find('["')

            start += 1  # skip the bracket, move to the next character

            end = s.find('"]', start)

            print(s[start:end])

            return s[start:end]

Но он дает мне только следующий вывод:

"абстрактный", "общий", "справочный", "введение", "мотивация"

Пожалуйста, дайте мне знать, что нужно изменить, чтобы получить желаемый результат?

Ответы [ 3 ]

1 голос
/ 11 декабря 2019

Это регулярное выражение

import re
s = '[["abstract", "common", "reference", "introduction", "motivation"], ["real", "day", "night", "twenty", "blood", "truck", "major", "ship", "plane"], ["weapon", "guns", "nuclear", "revolver"], ["rose", "princess", "flower", "beauty", "sunflower", "soldier", "imaginary", "jasmine"], ["cloth", "shirt", "jeans", "trouser"]]'

s = re.compile(']\s*,').sub('\n',s) # Line feed
s = re.compile('\[|\]').sub('',s) # Remove []
print (s)
1 голос
/ 11 декабря 2019

Вы можете попробовать этот код

def fileRead(fpath):
    f = open(fpath, "r")
    s=f.read()
    while (s.find('["')!=-1 and s.find('"]')!=-1):
        g=min(s.find('["'),s.find('"]'))
        s=s[:g]+s[g+2:]
    s=s[1:-2]
    f.close()
    return s

Я надеюсь, что я был полезен

1 голос
/ 11 декабря 2019

literal_eval идеально подходит для этого. Он в основном берет список, представленный в виде строки, и выдает список Python

a = """["hello"]"""
b = literal_eval(a)
b[0]
>>> "hello" 

А для вашего случая:

from ast import literal_eval


def fileRead(fpath):

    f = open(fpath, "r")
    f_string = f.readlines()
    f_list = literal_eval(f_string)
    print(f_list)
    for item in f_list:
        print(" ".join(item)) # joins words with space between them

Здесь - документация.

...