web-dev-qa-db-fra.com

Recherche de mots après un mot clé en python

Je veux trouver des mots qui apparaissent après un mot clé (spécifié et recherché par moi) et imprimer le résultat. Je sais que je suis censé utiliser regex pour le faire, et je l'ai aussi essayé, comme ceci:

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()

La sortie est juste:

"is"

Mais je veux obtenir tous les mots et les ponctuations qui suivent le mot "nom".

17
Ryan

Au lieu d'utiliser des expressions rationnelles, vous pouvez simplement (par exemple) séparer votre chaîne avec str.partition(separator) comme ceci:

mystring =  "hi my name is ryan, and i am new to python and would like to learn more"
keyword = 'name'
befor_keyowrd, 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'

Vous devez toutefois gérer les espaces blancs inutiles séparément.

26
Aufwind

Votre exemple ne fonctionnera pas, mais si je comprends bien l’idée:

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"

Ceci imprimera tout après "nom" et jusqu'à la fin de la ligne.

8
DominiCane

Une autre alternative ...

   import re
   m = re.search('(?<=name)(.*)', s)
   print m.groups()
3
fransua

Au lieu de "^name: (\w+)", utilisez:

"^name:(.*)"
3
Petar Ivanov

Ce que vous avez utilisé concernant votre sortie:

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

Ce que vous devez utiliser ( correspond à tous ):

re.search("name (.*)", s)
2
Tugrul Ates

Vous pourriez simplement faire

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

Cela divisera votre chaîne et renverra une liste comme celle-ci ['salut mon', 'est ryan, et je suis nouveau sur python et j'aimerais en savoir plus']

en fonction de ce que vous voulez faire, cela peut aider ou non.

1
Hassek
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
krish

Cela fonctionnera pour u: nom de travail\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
Poovaraghan

Sans utiliser regex, vous pouvez 

  • supprimer la ponctuation (envisager de tout mettre en majuscule, y compris le terme de recherche)

  • diviser votre texte en mots individuels

  • trouver l'index du mot recherché

  • obtenir Word du tableau (index + 1 pour Word après, index - 1 pour Word avant)

Extrait de code:

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

Pour plusieurs occurrences, vous devez enregistrer plusieurs index:

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']
0
philshem