Разбор элементов из текстового файла - PullRequest
3 голосов
/ 14 июня 2010

У меня есть текстовый файл, содержащий данные внутри тегов {[]}. Каков будет предложенный способ анализа этих данных, чтобы я мог просто использовать данные внутри тегов?

Пример текстового файла будет выглядеть так:

'это набор текста, который {[действительно]} бесполезен {[way]}. Мне нужно {[получить]} некоторые предметы {[из]} этого. '

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

Ответы [ 4 ]

6 голосов
/ 14 июня 2010

Я бы использовал регулярные выражения.В этом ответе предполагается, что ни один из символов тега {} [] не отображается в других символах тега.

import re
text = 'this is a bunch of text that is not {[really]} useful in any {[way]}. I need to {[get]} some items {[from]} it.'

for s in re.findall(r'\{\[(.*?)\]\}', text):
    print s

Использование подробного режима в регулярных выражениях python:

re.findall('''
    \{   # opening curly brace
    \[   # followed by an opening square bracket
    (    # capture the next pattern
    .*?  # followed by shortest possible sequence of anything
    )    # end of capture
    \]   # followed by closing square bracket
    \}   # followed by a closing curly brace
    ''', text, re.VERBOSE)
3 голосов
/ 14 июня 2010

Это задание для регулярных выражений:

>>> import re
>>> text = 'this is a bunch of text that is not {[really]} useful in any {[way]}. I need to {[get]} some items {[from]} it.'
>>> re.findall(r'\{\[(\w+)\]\}', text)
['really', 'way', 'get', 'from']
2 голосов
/ 15 июня 2010

медленнее, больше, без регулярных выражений

старый школьный путь: P

def f(s):
    result = []
    tmp = ''
    for c in s:
        if c in '{[':
            stack.append(c)
        elif c in ']}':
            stack.pop()
            if c == ']':
                result.append(tmp)
                tmp = ''
        elif stack and stack[-1] == '[':
            tmp += c
    return result

>>> s
'this is a bunch of text that is not {[really]} useful in any {[way]}. I need to {[get]} some items {[from]} it.'
>>> f(s)
['really', 'way', 'get', 'from']
1 голос
/ 22 июня 2010

Другой способ

def between_strings(source, start='{[', end=']}'):
    words = []
    while True:
        start_index = source.find(start)
        if start_index == -1:
            break
        end_index = source.find(end)
        words.append(source[start_index+len(start):end_index])
        source = source[end_index+len(end):]
    return words


text = "this is a bunch of text that is not {[really]} useful in any {[way]}. I need to {[get]} some items {[from]} it."
assert between_strings(text) == ['really', 'way', 'get', 'from']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...