создать список из списка на основе строкового шаблона - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть список, как пример данных ниже. Каждая запись в списке следует шаблону «source / number_something /». Я хотел бы создать новый список, как вывод ниже, где записи просто "что-то". Я думал, что мог бы использовать для l oop и разбиение строки на _, но некоторые из следующих текстов также включают _. Это похоже на то, что можно сделать с помощью регулярных выражений, но я не так хорош в регулярных выражениях. Любые советы приветствуются.

пример данных:

['source/108_cash_total/',
 'source/108_customer/',
 'source/108_daily_units_total/',
 'source/108_discounts/',
 'source/108_employee/',
'source/56_cash_total/',
 'source/56_customer/',
 'source/56_daily_units_total/',
 'source/56_discounts/',
 'source/56_employee/']

вывод:

['cash_total',
 'customer',
 'daily_units_total',
 'discounts',
 'employee',
'cash_total',
 'customer/',
 'daily_units_total',
 'discounts',
 'employee']

Ответы [ 3 ]

6 голосов
/ 21 апреля 2020

Вы можете использовать регулярное выражение:

\d+_([^/]+)

См. демонстрацию на regex101.com .


В Python:
import re

lst = ['source/108_cash_total/',
       'source/108_customer/',
       'source/108_daily_units_total/',
       'source/108_discounts/',
       'source/108_employee/',
       'source/56_cash_total/',
       'source/56_customer/',
       'source/56_daily_units_total/',
       'source/56_discounts/',
       'source/56_employee/']

rx = re.compile(r'\d+_([^/]+)')

output = [match.group(1) 
          for item in lst 
          for match in [rx.search(item)] 
          if match]
print(output)

Что дает

['cash_total', 'customer', 'daily_units_total', 
 'discounts', 'employee', 'cash_total', 'customer',
 'daily_units_total', 'discounts', 'employee']
0 голосов
/ 21 апреля 2020

вероятно, не так хорошо и чисто, как по сравнению с регулярным выражением

с использованием list comprehension и split function

lst = ['source/108_cash_total/',
 'source/108_customer/',
 'source/108_daily_units_total/',
 'source/108_discounts/',
 'source/108_employee/',
'source/56_cash_total/',
 'source/56_customer/',
 'source/56_daily_units_total/',
 'source/56_discounts/',
 'source/56_employee/']

res = [ '_'.join(i.split('_')[1:]).split('/')[:-1][0]  for i in lst]

print(res)

# output ['cash_total', 'customer', 'daily_units_total', 'discounts', 'employee', 'cash_total', 'customer', 'daily_units_total', 'discounts', 'employee']
0 голосов
/ 21 апреля 2020

Вы можете легко сделать это без регулярных выражений, используя только смещения и split() с набором параметров maxsplit:

offset = len("source/")
result = []
for item in lst:
    num, data = item[offset:].split("_", 1)
    result.append(data[:-1])

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

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