Как в Python получить слово по позиции символа
Есть некая строка и номер символа в этой строке:
some = "какой-то текст в качестве примера"
symbol = 18
Как можно получить слово (в данном примере качестве) при таких условиях?
UPD1: Как временное решение сделал что-то такое:
def finder(text, pos):
posS = 0
posE = len(text)
_posS = pos
while _posS>posS:
if text[_posS] in (" ", "\n"): posS = _posS+1
else: _posS -= 1
_posE = pos
while _posE<posE:
if text[_posE] in (" ", "\n"): posE = _posE
else: _posE += 1
return (posS, posE)
Однако как по мне этот вариант слишком долгий в дальнейшей перспективе да и в целом уверен есть что-то понятнее и лучше.
Ответы (2 шт):
Автор решения: entithat
→ Ссылка
Делаем так:
- Из строки взяли все слова в список
- Прошлись с помощью
map- нашли начальные индексы слов - Прошлись с помощью
filter- нашли индексы, которые меньше, чемpos - Взяли слово от самого большого индекса, который остался (это начало нашего слова) до первого пробела начиная от этого слова.
def findWord(s, pos):
if s.count(' ') < 1: return s # Если в строке нет пробелов
idx = list(filter(lambda x: x < pos, map(
lambda x: s.index(x), s.split(' '))))[-1]
return s[idx: idx + s[idx:].index(' ') + 1]
print(findWord("какой-то текст в качестве примера", 18)) # качестве
print(findWord("какой-то текст в качестве примера", 10)) # текст
print(findWord("какой-то текст в качестве примера", 8)) # какой-то
Либо:
- Ищем индекс пробела слева
- Ищем индекс пробела справа
- Вырезаем слово по этим границам
def findWord(s, pos):
if pos > len(s):
raise Exception('Position is greater than length of the word')
lsi = -1 if s[:pos].count(' ') == 0 else s[:pos].rindex(' ')
psi = len(s) if s[pos:].count(' ') == 0 else pos + s[pos:].index(' ')
return s[lsi + 1:psi]
print(findWord("There are more twins now than ever before.", 19)) # twins
P.S. Если надо решение в одну строку:
s = "There are more twins now than ever before."
pos = 14
print(s[-1 if s[:pos].count(' ') == 0 else s[:pos].rindex(' ') + 1:len(s) if s[pos:].count(' ') == 0 else pos + s[pos:].index(' ')]) # more
Автор решения: Zhihar
→ Ссылка
например так:
основная суть -
- взять последнее слово до искомой позиции (учесть нулевую позицию)
- взять первое слово после искомой позиции
- соединить
- учесть ситуацию, когда позиция находится вне строки или на разделителе
код:
some = "какой-то текст в качестве примера"
symbol = 18
if -1 < symbol < len(some) and some[symbol] != ' ':
block_s = '' if symbol == 0 else some[:symbol].split()[-1]
block_e = some[symbol:].split()[0]
res = block_s + block_e
else:
res = 'вне слова'
print(res)
дешево и сердито
первый блок можно получить чуть более хитро, но и более коротко:
block_s = ([''] + some[:symbol].split())[-1]
т.е. избежать списка нулевой длины дополнив список вначале пустой строкой
Ну и для любителей однострочных решений:
res = ([''] + some[:symbol].split())[-1] + some[symbol:].split()[0] if -1 < symbol < len(some) and some[symbol] != ' ' else '***вне слова***'