2016-01-06 2 views
1

У меня есть большой набор строк, и я хочу извлечь определенную часть каждой из строк. Каждая строка содержит подстроку так:Самый быстрый способ извлечь часть длинной строки в Python

my_token:[ 
    "key_of_interest" 
], 

Это единственная часть в каждой строке говорится my_token. Я думал о том, чтобы получить конечную позицию индекса 'my_token: ["' и после этого получить начальную позицию индекса ''] 'и получить весь текст между этими двумя позициями индекса.

Есть ли лучший или более эффективный способ сделать это? Я буду делать это для строки длиной ~ 10 000 и множеств размером 100 000.

Редактировать: Файл является файлом .ion. По моему мнению, это можно рассматривать как плоский файл - поскольку он основан на тексте и используется для описания метаданных.

+0

Если строка JSON, используйте 'json.loads' и обращайтесь к ней на анализируемом объекте, не пытайтесь разрезать ее как строку. – Amadan

+1

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

+1

@ Амадан Почему это было бы более эффективно? Если строка уже находится в памяти и ему не нужна какая-либо другая часть строки, разве это не просто добавление накладных расходов на загрузку строки в отдельный объект? –

ответ

1

Основополагающее требование проступает, когда вы уточнить:

Я думал о том, чтобы положение конечного индекса «my_token: [„„и после этого получает индекс позиции начала““],» и получая весь текст между этими двумя позициями индекса.

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

Нет веской причины строить непосредственно поверх примитивов строк для синтаксического анализа, если вы не заинтересованы в написании yet another parsing framework.

Итак, используйте библиотеки, написанные людьми, которые имели дело с проблемами, стоящими перед вами.

  • Если это JSON, используйте standard library json module; Тоже, если это какой-то другой язык с парсером уже в стандартной библиотеке Python.
  • Если это какой-то другой широко внедряемый стандарт: получите какую-то уже существующую стороннюю библиотеку Python, которая умеет правильно разбираться.
  • Если он еще не реализован: напишите собственный парсер, используя pyparsing или другую известную твердую библиотеку.

Итак, чтобы сделать правильный выбор, вам нужно знать что такое формат данных (это не отвечает «что имена файлов», а, вы должны знать, что это формат данных содержание этих файлов). Затем вы сможете найти библиотеку синтаксического анализатора, которая знает об этом формате данных.

+0

Файл является файлом .ion. Предлагаете ли вы использовать pyparsing? – MW2015

1

Как это можно сделать «самым тупым и простым способом»?

  • найти стартовую позицию
  • посмотреть на для конечной позиции
  • захватить все без разбора между двумя

Это действительно то, что вы делаете. Таким образом, любое дальнейшее усовершенствование может исходить только из оптимизации каждого шага.Возможные способы включают:

  • сузить области поиска (требует дополнительных ограничений/допущения в соответствии с comment56995056)
  • ускорить операцию поиска битов, которые включают в себя:
    • извлечения необработанных данных из формата
      • Вы уже сделали это, не обращая внимания на формат в целом - так что вам нужно убедиться, что некорректного синтаксического разбора (например, условия поиска, встроенные в строки в другом месте, или соответствующие часть маркера) в соответствии с comment56995034
    • элементарное сравнение шаблон операции
      • вряд ли достичь в чистом Python, поскольку str.index реализуется в C уже и реализация, вероятно, уже так просто, как может быть возможно
0

Ну, как уже упоминалось - анализатор кажется самым лучшим вариантом.

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

matches = re.match(r"my_token:\[\s*"(.*)"\s*\]\.",str) 
key_of_interest = matches.groups()[0] 

Есть другие проблемы, которые возникают. Например, что, если у вашего ключа есть " внутри него? strinified JSON будет автоматически использовать escape-символ там, и это будет также захватывать регулярное выражение. И поэтому это становится слишком сложным.

И JSON не является регулярным выражением само по себе (is-json-a-regular-language). Таким образом, используйте на свой страх и риск. Но с соответствующими ограничениями и предположениями регулярное выражение будет быстрее, чем json-парсер.

+0

Файл не является файлом JSON. Это файл .ion. – MW2015

+0

Это интересно. Я никогда не слышал о файле .ion. Не могли бы вы дать полную форму или то, для чего она используется? – AbdealiJK

Смежные вопросы