Как я могу извлечь часть слов из файла, используя python3.6?

Я хочу извлечь конкретное слово из текстового файла.
Вот пример текстового файла:
https://drive.google.com/file/d/0BzQ6rtO2VN95d3NrTjktMExfNkU/view?usp=sharing
Пожалуйста, просмотрите это.
Я пытаюсь извлечь строку как:

"Name": "the name infront of it"
"Link": "Link infront of it"

Скажем из входного файла, я ожидаю получить вывод, как это:

"Name":"JTLnet"
"Link":"http://jtlnet.com"
"Name":"Apache 1.3"
"Link":"http://httpd.apache.org/docs/1.3"
"Name":"Apache"
"Link":"http://httpd.apache.org/"
.
.
.
"Name":"directNIC"
"Link":"http://directnic.com"

Если эти слова находятся где-либо в файле, он должен быть извлечен в другой файл.
Пожалуйста, дайте мне знать, как я могу достичь такого рода добычи? Пожалуйста, рассмотрите файл как маленькую часть большого файла.
Кроме того, это текстовый файл, а не JSON.
Пожалуйста, помогите мне.

3 ответа

Решение

Краткое решение с использованием re.findall() а также str.split() функции:

import re

with open('test.txt', 'r') as fh:
    p = re.compile(r'(?:"Categories":[^,]+,)("Name":"[^"]+"),(?:[^,]+,)("Link":"[^"]+")')
    result = [pair for l in re.findall(p, fh.read()) for pair in l]

print('\n'.join(result))

Вывод (фрагмент):

"Name":"JTLnet"
"Link":"http://jtlnet.com"
"Name":"Apache 1.3"
"Link":"http://httpd.apache.org/docs/1.3"
"Name":"Apache"
"Link":"http://httpd.apache.org/"
"Name":"PHP"
....

Поскольку текстовый файл не отформатирован должным образом, единственным вариантом для вас является регулярное выражение. Приведенный ниже фрагмент работает для данного файла примера.

Имейте в виду, что для этого необходимо загрузить весь файл в память

import re, json
f = open(r'filepath')
textCorpus = f.read()
f.close()
# replace empty strings to non-empty, match regex easily
textCorpus = textCorpus.replace('""', '" "')
lstMatches = re.findall(r'"Name".+?"Link":".+?"', textCorpus)
with open(r'new_file.txt', 'ab+) as wf:
    for eachMatch in lstMatches:
        convJson = "{" + eachMatch + "}"
        json_data = json.loads(convJson)
        wf.write(json_data["Name"] + "\n")
        wf.write(json_data["Link"] + "\n")

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

Предположения:

  • интересная часть после "Name" или же "Link" является:

    • отделяется от идентификатора двоеточием (:)
    • в двойных кавычках (") без двойных кавычек
  • файл структурирован в строки
  • Поля Name и Link всегда находятся в одной строке (в полях нет новой строки)

Вы можете обрабатывать ваш файл построчно с помощью простого re.finditer на каждой строке:

rx = re.compile(r'(("Name":".*?")|("Link":".*?"))')
with open(inputfile) as fd:
    for line in fd:
    l = rx.finditer(line)
        for elt in l:
            print(elt.group(0))

Если вы хотите вывести данные в другой файл, просто откройте его перед фрагментом выше open(outputfile, "w") as fdout: и замените строку печати:

fdout.write(elt.group(0) + "\n")
Другие вопросы по тегам