2010-12-12 21 views
2

Je me demandais comment trouver une chaîne que vous ne savez pas ce qui est, dans une chaîne. J'écris un bot IRC et j'ai besoin de cette fonction. Je veux être capable d'écrire:Comment trouver x dans une chaîne en Python

saluer Greg

puis mon bot est censé dire! « Salut, Greg! ». Donc ce qui vient après le salut est variable. Et si j'écrivais, salue Matthew, il dirait "Salut, Matthew!". Est-ce possible?

Merci beaucoup.

Andesay

+1

Pourquoi le vote à la baisse? –

+0

Je suppose que parce que la question n'est pas claire. (Ce n'était pas moi) +0 –

+1

Vous réalisez qu'à moins que cela reste vraiment simple, vous aurez besoin de construire un vrai parseur? – delnan

Répondre

3
if command.lower().startswith('!greet '): 
    put('Hi, ' + command[7:].strip() + '!') 

'!greet Greg' -> [ put()s 'Greg' ] 
'!Greet Fred ' -> [ put()s 'Fred' ] 
'!hello John' -> [ nothing ] 
+0

De quel module est-il fait partie? Il dit que put n'est pas défini quand j'essaie l'échantillon de code. – Andesay

+0

vous devrez changer mettre à une fonction qui envoie un msg. mettre est juste une fonction d'exemple. –

+1

@Andesay: 'print 'Bonjour, {0}!'. Format (commande [7:]. Strip())' – user225312

-1

si "Greg" dans greet: doSomething ("Salut Greg")

la clé est que les chaînes prennent le dans l'opérateur

+1

Merci pour la réponse rapide! Mais que se passe-t-il si je n'avais aucune idée du nom qui serait mis là? – Andesay

1

Il est simple:

>>> import re 
>>> m = re.search(r"!greet (?P<name>.+)", "!greet Someone") 
>>> m.group("name") 
'Someone' 
3
import re 
... 
input = '!greet Greg' 
m = re.match(r'!greet\s+(.*)', input) 
if m: 
    print 'Hi, %s!' % m.group(1) 
+1

Pourquoi cette fonctionnalité a-t-elle été réduite? –

+3

Les gens qui se rétractent et ne prennent pas la peine de laisser un commentaire expliquant ce qui ne va pas sont frustrants. +1 cependant. – user225312

+0

Je n'ai pas downvote, mais j'imagine qu'ils l'ont fait parce que vous avez utilisé 're.match' et ensuite une construction if quand vous auriez pu utiliser une fonction plus appropriée de' re'. –

3

Si vous envisagez d'ajouter plus de complexité à votre bot, je suggère d'utiliser des expressions régulières comme ceci:

Dans un premier temps, vous définissez les fonctions dont votre bot peut avoir besoin.

def greet_user(name): 
    print 'Hello, %s' % name 

Ensuite, vous définissez le modèle et un dict de commandes:

import re 
pattern = re.compile(r'!(?P<command>\w+)\s*(?P<args>\w*)') 
commands = {'greet': greet_user} 

Maintenant, il vous suffit d'appeler pattern.match() avec l'entrée d'utilisateur et la fonction appropriée:

m = pattern.match(string) 
commands.get(m.group('command'))(m.group('args')) 

Si une l'utilisateur entre une commande invalide, une erreur TypeError est levée.

Maintenant, vous pouvez ajouter n'importe quelle fonction simplement en éditant le commands -dict.