как я могу получить строку после определенной подстроки.
Например, я хочу получить строку после "world"
в my_string="hello python world , i'm a beginner"
.
Самым простым способом, вероятно, является разделение на целевое слово
my_string="hello python world , i'm a beginner "
print my_string.split("world",1)[1]
split принимает слово (или символ) для разделения и, по желанию, ограничение на количество разделений.
В этом примере нужно разделить слово "мир" и ограничить его только одним разделением.
s1 = "hello python world , i'm a beginner "
s2 = "world"
print s1[s1.index(s2) + len(s2):]
Если вы хотите разобраться со случаем, когда s2
не присутствует в s1
, то используйте s1.find(s2)
, а не index
. Если возвращаемое значение этого вызова равно -1
, значит, s2
нет в s1
.
Я'м удивлен, никто не упомянул перегородки
.
def substring_after(s, delim):
return s.partition(delim)[2]
ИМХО, это решение является более читабельным, чем @arshajii'ов. Кроме этого, я думаю, что @arshajii's-это лучшее для самых быстрых-это не создавать лишних копий/подстрок.
Если вы хотите сделать это с помощью regex, вы можете просто использовать не захватывающую группу, чтобы получить слово "мир", а затем захватить все, что после, как показано ниже
(?:world).*
Пример строки проверен здесь
Вы хотите использовать ул.раздел()
:
>>> my_string.partition("world")[2]
" , i'm a beginner "
поскольку этот параметр является быстрее, чем альтернативы. Обратите внимание, что это создает пустую строку, если разделитель отсутствует:
>>> my_string.partition("Monty")[2] # delimiter missing
''
Если вы хотите иметь исходную строку, а затем проверить, если второго значение, возвращаемое из `ул. раздел () является непустым:
prefix, success, result = my_string.partition(delimiter)
if not success: result = prefix
Вы также можете использовать ул.сплит()
с лимитом 1:
>>> my_string.split("world", 1)[-1]
" , i'm a beginner "
>>> my_string.split("Monty", 1)[-1] # delimiter missing
"hello python world , i'm a beginner "
Однако, этот вариант медленнее. В лучшем случае, ул..раздел()
легко о 15% быстрее по сравнению с НТР.сплит()
:
нет отсутствует первая нижняя верхняя последняя ул. раздел(...)[2]: [3.745 МКС] [0.434 МКС] [МКС 1.533] <3.543 МКС> [4.075 МКС] ул. раздел(...) и теста: 3.793 МКС МКС МКС МКС МКС 0.445 1.597 3.208 4.170 ул. сплит(..., 1)[-1]: <3.817 МКС> <0.518 МКС> <1.632 МКС> [3.191 МКС] <4.173 МКС> % лучший против худшего: 1.9% 16.2% 6.1% 9.9% 2.3% `` Это показывает тайминги *в исполнении* с входами здесь разделителем является либо отсутствует (в худшем случае), занял первое место (в лучшем случае), или в нижней половине, верхняя половина или последняя позиция. Самое быстрое время обозначен
[...]и
<...>` исполняется самое худшее.
В приведенной выше таблице производится комплексное испытание времени для всех трех вариантов ниже. Я прогнал тесты на Python 3.7.4 на 2017 модель 15" и в MacBook Pro с процессором Intel 2.9 ГГц Core i7 и 16 ГБ оперативной памяти.
Этот скрипт генерирует случайные предложения С и без случайно выбранный разделитель присутствует, а если присутствует, на различных должностях в созданном предложении выполняет тесты в случайном порядке с раппортом (производить самые справедливые результаты учета ОС случайных событий, происходящих во время тестирования), а затем печатает таблицу результатов:
``питон
импорт случайных
из модуле itertools импорт товара
от импортных оператор itemgetter
от pathlib пути импорта
от раз все таймер импорт
Настройки = "от главный импорт предложении с разделителями, как D" и
тесты = {
ул. и".на" перегородки(...)[2];: "У р = ы.раздел(д)[2] и",
ул. и".раздел(...) и тест-то": (
"по-приставка, успех, результат = С. раздел(д)\н" и
"если не успеха: результат = префикс" и
),
ул. и".на" сплит(..., 1)[-1];: "и р = ы.сплит(Д, 1)[-1]" и,
}
размещение = "не хватает первой нижней верхней последнее".сплит()
delimiter_count = 3
wordfile = путь(" в файле/usr/дикт/слова и") # Линукс
если не wordfile.существует():
wordfile = путь(" в/usr/доли/дикт/слова и") слова = [Вт.прокладки() для W в wordfile.открыть()] деф gen_sentence(разделитель, где=то"отсутствует" И, Л=1000): " и" в"и генерировать случайную фразу длиной L Разделитель зарегистрирована по стоимости, где: "не хватает" и: не разделитель на "первой": - разделитель-первое слово на "низкий" и: разделитель присутствует в первой половине на "верхних" в: разделитель присутствует во второй половине фильм "Последнее": разделитель последнее слово " и" и" в возможно = [W для W в слова, если разделитель не в Вт] приговор = случайное.выбор(возможно, к=л) половина = л // 2 если где = = на "первой":
предложения[0] = разделитель Элиф, где = = на "низкий" и:
приговор[случайный.randrange(1, тайм)] = разделитель Элиф, где = = на "верхних" по: приговор[случайный.randrange(половина, л)] = разделитель Элиф, где ==, что "Последнее": приговор[-1] = разделитель
возвращение " на глаз ".присоединяйтесь к(предложение) разделители = случайное.выбор(словами, K=delimiter_count) тайминги = {} предложения = [
(ш, д, gen_sentence(д, ш)) Д, Ш, В продукта(разделителей, размещение) ] test_mix = [
(Т С) для T, S в продукте(тесты.элементы(), предложения) ] случайные.перетасовать(test_mix) для меня, (ярлык, тест, где, разделитель, предложение) в перечислить(test_mix, 1): печати(ф" в rRunning\тестов, {я:2Д}/{(testmix)} на" лен; конец=" не то") Т = таймер(тестирование, настройка) количество, = Т.автополигон() результаты = Т.повторить(5, количество)
тайминги.значение setdefault( метки {} ).значение setdefault( где, [] ).добавить(мин(ДТ / номер ДТ в результаты)) печать() весы = [(1.0, 'сек'), (0.001, 'МС'), (1Э-06, 'МКС'), (1е-09, 'НС')] ширина = Макс(карта(лен, тайминги)) строк = [] bestrow = дикт.fromkeys(размещение, (поплавка (на"инф") смотрите, нет)) worstrow = дикт.fromkeys(размещение, (поплавка(" у-инф и"), Нет)) в строке, этикетка на перечисление(тесты): столбцы = [] худший = поплавок(" у-инф и") для P в размещении: время = мин(тайминги[метка], [Р]) если времени < bestrow[П][0]: bestrow[п] = (сроков подряд) если времени > worstrow[П][0]: worstrow[п] = (сроков подряд) худший = Макс(сроки, худший) столбцы.добавить(ГРМ) шкала, единица = следующий((Ы, У) по Х, У в Весы, если худшее >= з) строк.добавить( [ф" и{метка:>{ширина}}:" У, (Ф" и {с / масштаб:.Я 3Ф} {блок} &; для C в Столбцах)] ) colwidth = Макс(ДЛСТР(С) для R в строках для C в R[1:]) печать(' ' (ширина + 1), (стр. центр(colwidth) для P в размещении), сентября=" не то ") для R, строки в перечисление(строк): для C, P в перечислить(размещение, 1): если bestrow[П][1] == р: подряд[с] = ф" в[{строка[с][1:-1]}] и" Элиф worstrow[П][1] == р: подряд[с] = ф" и<{строка[с][1:-1]}>" и печать(строки,=то" сентября; и") проценты = [] для P в размещении: лучшее, худшее = bestrow[П][0], worstrow[П][0] соотношение = ((хуже - лучше) / худший) проценты.добавление(ф" и{коэффициент:{colwidth - 1}.1%} и") печать (на"% Лучший против худшего:" по.rjust(ширина + 1), *проценты,=то" сентября; и") ``
Это'ы старый вопрос, но я столкнулся с очень же сценарию, мне нужно, чтобы разделить строку, используя в качестве demiliter слово на "низкий" и проблема для меня было то, что у меня в одной строке слово ниже и ниже.
Я решил его с помощью повторного модуль таким образом
import re
string = '...below...as higher prices mean lower demand to be expected. Generally, a high reading is seen as negative (or bearish), while a low reading is seen as positive (or bullish) for the Korean Won.'
использовать заново.сплит с регулярное выражение, чтобы соответствовать точное слово
stringafterword = re.split('\\blow\\b',string)[-1]
print(stringafterword)
' reading is seen as positive (or bullish) for the Korean Won.'
общий код:
re.split('\\bTHE_WORD_YOU_WANT\\b',string)[-1]
Надеюсь, что это может помочь кому-то!
Вы можете использовать этот пакет называется "подстроки и". Просто типа „пункт Установить подстроки и". Вы можете получить подстроку, просто отметив начальный и конечный символы/индексы.
Например:
import substring
s = substring.substringByChar("abcdefghijklmnop", startChar="d", endChar="n")
print(s)
Выход: