Как мне выполнить команду для каждого разделения? - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в Python и пытаюсь отфильтровать строку, которая выглядит примерно так:

"{Red,Plant,Eel}{Blue,Animal,Maple}{Yellow,Plant,Crab}"

И так далее для 100 с из трех наборов слов.

Я хочуизвлеките второе слово из каждого набора, помеченного "{}", поэтому в этом примере я хочу вывод:

"Plant,Animal,Plant"

И т. д.

Как я могу сделать это эффективно?

На данный момент я использую string.split(",")[1] индивидуально для каждой группы "{}".

Спасибо.

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018
#!/bin/python3

string = "{Red,Plant,Eel}{Blue,Animal,Maple}{Yellow,Plant,Crab}"
a = string.replace('{','').replace('}',',').split(',')[1::3]
print(a)

результат ['Plant', 'Animal', 'Plant']

0 голосов
/ 27 ноября 2018

Попробуйте:

[i.split(',')[1] for i in str_[1:].split('}')[:len(str_.split('}'))-1]]
0 голосов
/ 27 ноября 2018

другое решение использует регулярное выражение, немного более сложное, но об этом стоит поговорить:

import re
input_string = "{Red,Plant,Eel}{Blue,Animal,Maple}{Yellow,Plant,Crab}"
regex_string = "\{\w+\,(\w+)\,\w+\}"

result_list = re.findall(regex, input_string)

, тогда result_list вывод:

['Plant',' Animal ',' Plant ']

здесь есть ссылка для регулярных выражений в python и онлайн-редактор регулярных выражений

0 голосов
/ 27 ноября 2018

Это делает трюк:

str_ = "{Red,Plant,Eel}{Blue,Animal,Maple}{Yellow,Plant,Crab}"
res = [x.split(',')[1] for x in str_[1:-1].split('}{')]

и производит

['Plant', 'Animal', 'Plant']

с str_[1:-1], мы удаляем начальные "{" и завершающие "}", и мызатем разделяем оставшиеся объекты на каждый экземпляр "}{", получая таким образом:

["Red,Plant,Eel", "Blue,Animal,Maple", ...]

, наконец, для каждой строки мы разделяем на ",", чтобы получить

[["Red", "Plant", "Eel"], ...]

, из которого мыоставляйте только первый элемент каждого подсписка с x[1].

Обратите внимание, что для вашей конкретной цели нарезка исходной строки с помощью str_[1:-1] не обязательна (работает и без нее), но если вы хотите толькопервый вместо второго пункта это будет иметь значение.То же самое верно и в случае, если вы хотите третий.


Если вы хотите объединить строки выходных данных в соответствии с желаемым результатом, вы можете просто передать полученный список в .join следующим образом:

out = ','.join(res)

, что дает вам

"Plant,Animal,Plant"
...