Поиск слов после ключевого слова в питоне - PullRequest
19 голосов
/ 09 июля 2011

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

import re
s = "hi my name is ryan, and i am new to python and would like to learn more"
m = re.search("^name: (\w+)", s)
print m.groups()

Вывод просто:

"is"

Но я хочуполучить все слова и знаки препинания после слова «имя».

Ответы [ 9 ]

28 голосов
/ 09 июля 2011

Вместо использования регулярных выражений вы можете (например) разделить вашу строку с помощью str.partition(separator) следующим образом:

mystring =  "hi my name is ryan, and i am new to python and would like to learn more"
keyword = 'name'
before_keyword, keyword, after_keyword = mystring.partition(keyword)
>>> before_keyword
'hi my '
>>> keyword
'name'
>>> after_keyword
' is ryan, and i am new to python and would like to learn more'

Вы должны иметь дело с ненужными пробелами отдельно, хотя.

11 голосов
/ 09 июля 2011

Ваш пример не будет работать, но, как я понимаю, идея:

regexp = re.compile("name(.*)$")
print regexp.search(s).group(1)
# prints " is ryan, and i am new to python and would like to learn more"

Это будет печатать все после "имени" и до конца строки.

4 голосов
/ 09 июля 2011

Другая альтернатива ...

   import re
   m = re.search('(?<=name)(.*)', s)
   print m.groups()
3 голосов
/ 09 июля 2011

Вместо "^name: (\w+)" используйте:

"^name:(.*)"
2 голосов
/ 09 июля 2011

Что вы использовали в отношении своей продукции:

re.search("name (\w+)", s)

Что вы должны использовать ( соответствует всем ):

re.search("name (.*)", s)
1 голос
/ 16 октября 2017
import re
s = "hi my name is ryan, and i am new to python and would like to learn more"
m = re.search("^name: (\w+)", s)

print m.group(1)
1 голос
/ 23 марта 2017

Это сработает для вас: имя работы \ s \ w + \ s (\ w +)

>>> s = 'hi my name is ryan, and i am new to python and would like to learn more'
>>> m = re.search('name\s\w+\s(\w+)',s)
>>> m.group(0)
'name is ryan'
>>>> m.group(1)
'ryan'
1 голос
/ 09 июля 2011

Вы могли бы просто сделать

s = "hi my name is ryan, and i am new to python and would like to learn more"
s.split('name')

Это разделит вашу строку и вернет список вроде этого ['hi my', 'это Райан, и я новичок в python и хотел бы узнать больше']

В зависимости от того, что вы хотите сделать, это может помочь или нет.

0 голосов
/ 23 марта 2017

Без использования регулярных выражений вы можете

  • убрать пунктуацию (рассмотрите возможность создания единого регистра, включая поисковый запрос)

  • разбить текст наотдельные слова

  • найти индекс искомого слова

  • получить слово из массива (index + 1 для слова после, index - 1 для слова перед)

Фрагмент кода:

import string
s = 'hi my name is ryan, and i am new to python and would like to learn more'
t = 'name'
i = s.translate(string.maketrans("",""), string.punctuation).split().index(t)
print s.split()[i+1]

>> is

Для нескольких случаев необходимо сохранить несколько индексов:

import string
s = 'hi my NAME is ryan, and i am new to NAME python and would like to learn more'
t = 'NAME'
il = [i for i, x in enumerate(s.translate(string.maketrans("",""), string.punctuation).split()) if x == t]
print [s.split()[x+1] for x in il]

>> ['is', 'python']
...