2017-02-19 3 views
3

Я хочу сделать простой код, который принимает один кусок текста, сканирует ключевое слово и печатает ключевое слово вместе со следующими 5 символами. Обратите внимание, что ключевое слово может отображаться более одного раза в тексте.напечатать 5 символов, которые появляются после ключевого слова

string = 'my name is luka 90/91, I live on the second floor' 
    keyword = 'luka' 

    if key in string: 
     print (key + key[0:5]) 

выход должен быть Luka 90 \ 91

+1

Ключевое слово наряду со следующими пятью символами фактически будет ' 'Luka 90/9''. – jonrsharpe

+0

Вы хотите напечатать все следующие 5 символов, когда появится слово «keyword»? или только первое появление? –

ответ

5

Используя str.find, вы можете получить индекс строки соответствия:

>>> string = 'my name is luka 90/91, I live on the second floor' 
>>> keyword = 'luka' 
>>> string.find(keyword) 
11 

>>> i = string.find(keyword) 
>>> string[i:i+len(keyword)+5] 
'luka 90/9' 
>>> string[i:i+len(keyword)+5+1] # +1 (count space in between) 
'luka 90/91' 

UPDATE Чтобы получить все вхождения, вам нужно найти подстроку в цикле.

string = 'my name is luka 90/91, I live on the second floor luka 12345' 
keyword = 'luka' 

i = 0 
while True: 
    i = string.find(keyword, i) # `i` define from where the find start. 
    if i < 0: 
     break 
    j = i + len(keyword) + 5 + 1 
    print(string[i:j]) 
    i = j 

ОБНОВЛЕНИЕ решение с использованием re.findall:

>>> string = 'my name is luka 90/91, I live on the second floor luka 12345' 
>>> keyword = 'luka' 
>>> import re 
>>> re.findall(re.escape(keyword) + '.{5}', string) 
['luka 90/9', 'luka 1234'] 
>>> re.findall(re.escape(keyword) + '.{6}', string) 
['luka 90/91', 'luka 12345'] 
  • luka матчей буквально. .{5} соответствует любым 5 символам.
  • Если вы хотите совместить символы, даже если они меньше 5 символов. Вместо этого используйте .{1,5}.
  • re.escape не требуется для luka. Это необходимо, если в регулярном выражении есть специальные символы, которые имеют особое значение.
+1

Результат должен включать ключевое слово, по-видимому ... –

+0

@JonClements, Спасибо за комментарий. Я соответствующим образом обновил ответ. – falsetru

+1

ОП также упоминал, что подстрока может отображаться более одного раза. Возможно, вы захотите упомянуть второй аргумент str.index. – dabadaba

1
import re 

string = 'my name is luka 90/91, I luka onthe second floor' 
keyword = 'luka' 

i = [m.start() for m in re.finditer(keyword, string)] 
K = [[keyword + ' '+ string[len(keyword)+1+j:len(keyword)+j+5+1]] for j in i] 

Или лучшее решение: L = re.findall(keyword + ' .{5}', string)

print(K)

ВЫВОД:

[['luka 90/91'], ['luka onthe']] 

print(L)

ВЫВОД:

['luka 90/91', 'luka onthe']

я добавил дополнительный 1 для пространства, и предполагается, ключевое слово после keyword достаточно большой. В противном случае появятся пробелы. Если это нежелательно, оно может быть исправлено. Но такое поведение не определяется вами как должно быть.

+2

Любая причина, по которой вы не просто используете: 're.findall ('luka. {5}', string)'? –

+0

@JonClements нет. Я просто дал ему решение, которое я знаю. Я попробую это и переделаю, если потребуется. Спасибо за внимание. –

+0

Возможно, вам нужно '{, 5}', если до, но обязательно 5 или более букв следует за ключевым словом –

0
string = 'my name is luka 90/91, I live on the second floor. luka means nothing' 
keyword = 'luka' 
split_array = string.split(keyword) 
for x in split_array[1:]: # If keyword is found split array would contain more than one element 
    print keyword, x.strip()[:5] 

ВЫВОД

luka 90/91 
luka means 
Смежные вопросы