Объединение различных элементов в массиве с нечетными интервалами с использованием python, регулярных выражений и join () - PullRequest
0 голосов
/ 06 января 2020

Я создаю программу на Python, которая берет данные с веб-сайта и сохраняет их в базе данных. Мой вопрос касается форматирования данных, которые я собираю с веб-сайтов. Как только я очищаю их, я помещаю их в массив для форматирования. Я столкнулся с проблемой с данными об ингредиентах, в основном используемом измерении, а затем о количестве для измерения. В моем массиве будет ряд величин, измерений, а иногда и целых сумм, но все они будут разделены.

Пример:

amount = ['1', 'Teaspoon', '2', '0.75', 'Cups', '0.5', 'Tablespoons', '5']

Как видите, «Чайная ложка», «Чашки», «Столовые ложки» отделены от их соответствующего количества, которое является числом, которое предшествует им. Сольные числа «2» и «5» представляют целые числа (например, 2 яйца или 5 апельсинов), поэтому мне не нужно беспокоиться о них.

Мне нужны были такие данные:

amount = ['1 Teaspoon', '2', '0.75 Cups', '0.5 Tablespoons', '5']

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

Код:

    amount = ['1', 'Teaspoon', '2', '0.75', 'Cups', '0.5', 'Tablespoons', '5']
    minus1 = 0
    plus1 = 0
    count = 0
    for i in amount :

       if minus1 >= 1 :
           minus1 = count
           minus1 -=1
       if plus1 >= 1 :
           plus1 = count
           plus1 +=1

       strCheck = re.search(r"[a-z]", i)
       if strCheck != None :
           amount[minus1:plus1] = [' '.join(amount[minus1:plus1])]

       minus1 +=1
       plus1 +=1
       count +=1

   print(amount)

Я ищу альтернативу тому, что я сделал, есть ли способ достичь тех же результатов, но без использования счетчиков int? Является ли метод join () действительно единственным вариантом здесь? Для идентификации строк или букв алфавита внутри массива является ли Regex лучшим вариантом?

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Большое спасибо Joran Beasley за post

amount = ['1', 'Teaspoon', '2', '0.75', 'Cups', '0.5', 'Tablespoons', '5']

sol = list(filter(None, re.split("\s?(\d+\.?\d*\s*[a-zA-Z]+)\s?", ' '.join(amount))))
print(sol)

Здесь
1. re.split используется для разбиения заданной строки с помощью выражения регулярного выражения .
2. данная строка для функции split имеет вид ' '.join(amount)
3. join(amount) делает строку из списка разделенной пробелом.
4. filter встроенная функция используется для отфильтровать пустые / недействительные записи.
5. external most - list функциональные пакеты упаковывают результат filter в контейнер списка.

0 голосов
/ 06 января 2020

просто объедините все это

s = ' '.join(words)

, а затем используйте re.split

solution = re.split("(\d+\.?\d* [a-zA-Z]+)",s)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...