Дизайн - парсинг и редукция имен файлов - PullRequest
0 голосов
/ 25 марта 2019

Я столкнулся с проблемой, когда мне нужно было бы проанализировать имена файлов, когда я не знаю шаблоны указанных имен файлов и иметь возможность группировать их по общим шаблонам (/ знаменатели?)

Не нужно беспокоиться о расширениях файлов

Принимая следующие имена:

Парагвай-2018_500x500

Парагвай-2018_120X120

Парагвай-2018_64xx64

Matt-21_Birthday_2019

Matt-21_Birthday-1024x800_2019

Matt-21_Birthday-800x800_2019

Matt-21_Birthday-500x500_2019

Вы получите следующий результат:

[[ "Парагвай", "2018"], [ "Matt", "21", "День рождения", "2019"]]

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

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

  • Имена файлов не соответствуют заранее заданному соглашению об использовании шаблонов / имен (см. Как и как используются _)
  • Шаблон для удаления также не является регулярным (рассмотрим опечатку хх)
  • Выбрасывать номера не вариант
  • Указанные числа также не соответствуют шаблону (21, 2018, 2019)

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

Хотя код был бы отличным, я очень доволен горсткой указателей, чтобы начать / поставить на правильный путь. Это не домашний аутсорсинг:)

Спасибо.

1 Ответ

1 голос
/ 26 марта 2019

Вы можете использовать re.findall с шаблоном, который ищет либо алфавиты, либо чисто цифры, и использует шаблоны негативного взгляда назад и негативного прогнозирования, чтобы избежать их смешивания:

import re
re.findall(r'(?<![a-z\d])(?:[a-z]+|\d+)(?![a-z\d])', s, re.IGNORECASE) for s in l]

, так что дано:

l = [
    'Paraguay-2018_500x500',
    'Paraguay-2018_120X120',
    'Paraguay-2018_64xx64',
    'Matt-21_Birthday_2019',
    'Matt-21_Birthday-1024x800_2019',
    'Matt-21_Birthday-800x800_2019',
    'Matt-21_Birthday-500x500_2019'
]

это возвращает:

[['Paraguay', '2018'],
 ['Paraguay', '2018'],
 ['Paraguay', '2018'],
 ['Matt', '21', 'Birthday', '2019'],
 ['Matt', '21', 'Birthday', '2019'],
 ['Matt', '21', 'Birthday', '2019'],
 ['Matt', '21', 'Birthday', '2019']]

Если вы не хотите использовать регулярное выражение, вы можете вместо этого использовать itertools.groupby с ключевой функцией str.isalnum для получения буквенно-цифровых символовтокены из заданной строки, а затем используйте другой фильтр, который объединяет str.isalpha и str.isdigit, чтобы исключить токены, представляющие собой смесь алфавитов и цифр:

from itertools import groupby
[[t for t in (''.join(g) for k, g in groupby(s, key=str.isalnum) if k) if t.isalpha() or t.isdigit()] for s in l]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...