Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Срезы в строках

#python


Всем привет! вопрос: есть несколько линий в тхт, например 

'Карман-рукав?шов'
'Карман-рукав?чтото'
'Карман-рукав?чтотоеще'


мне надо сделать срез из каждой строки части от символа - до символа ?, и присвоить
переменной, но мой метод не работает. подскажите пожалуйста что не так:

srez = line ['-':'?']

    


Ответы

Ответ 1



Ваш метод не может работать, т.к. строку можно индексировать только целыми числами, а не другими строками. На выбор: srez = line.split('?')[0].split('-')[1] srez = line[line.find('-')+1:line.find('?')] Дополню, про использование index вместо find. Если модифицировать 2-й вариант как srez = line[line.find('-'):line.find('?')][1:] то результат в случае отсутствия в строке ? и/или - можно считать вполне корректным: в случае отсутствия - всегда получится пустая строка, если нет ? но есть - - подстрока от - до конца. Считать ли такой результат верным - решать только автору вопроса, зависит от целей нахождения подстроки. P.S. выбрасывание исключения для "невалидной" входящей строки - вполне разумный способ обработки.

Ответ 2



Чтобы достать все срезы сразу из файла: import re from pathlib import Path slices = re.findall(r'\-(.*?)\?', Path('файл.txt').read_text()) Если только из одной строки срез получить, чтобы реализовать псевдо-код line['-':'?']: result = line[line.index('-')+1:line.index('?')] при условии, что '?' не встречается до '-' в строке (что строки похожи на примеры в вопросе). Иначе: i = line.index('-') result = line[i+1:line.index('?', i)] index() используется вместо find(), чтобы получить ValueError на неверных входных данных (в которых или '-' или '?' отсутствуют), вместо того чтобы молча вернуть неверный результат.

Ответ 3



Также можно воспользоваться регулярными выражениями (RegEx) In [99]: data Out[99]: ['Карман-рукав?шов', 'Карман-рукав?чтото', 'Карман-рукав?чтотоеще'] In [100]: import re In [101]: [re.search(r'-([^\?]*)\?', x).group(1) for x in data] Out[101]: ['рукав', 'рукав', 'рукав'] Хотя в данном (простом) случае - решение от @andy.37 будет быстрее/эффективнее

Комментариев нет:

Отправить комментарий