2010-11-12 5 views
2

J'ai une chaîne dans une application django/python et j'ai besoin de la rechercher pour chaque instance de [x]. Cela inclut les parenthèses et x, où x est un nombre compris entre 1 et plusieurs millions. Je dois ensuite remplacer x avec ma propre chaîne.rechercher une chaîne au format '[nombre]' en utilisant regex

c.-à-'Some string [3423] of words and numbers like 9898' se transformerait en 'Some string [mycustomtext] of words and numbers like 9898'

Notez que le nombre entre crochets a été affecté. Je ne suis pas familier avec regex, mais pense que cela va le faire pour moi?

+0

Est-ce que '' [0] 'est un problème? –

+0

Je préférerais ne pas le faire, mais je suppose que je pourrais traiter ce cas particulier individuellement – rsp

Répondre

4

Regex est exactement ce que vous voulez. Il est le module re en Python, vous aurez envie d'utiliser re.sub, et il ressemblera à quelque chose comme:

newstring = re.sub(r'\[\d+\]', replacement, yourstring) 

Si vous devez faire beaucoup de celui-ci, pensez à la compilation de l'expression rationnelle:

myre = re.compile(r'\[\d+\]') 
newstring = myre.sub(replacement, yourstring) 

Edit: Pour réutiliser le numéro, utilisez un groupe regex:

newstring = re.sub(r'\[(\d+)\]',r'[mytext, \1]', yourstring) 

la compilation est toujours possible aussi.

+1

'\ d *' correspond à «zéro chiffre ou plus». Vous voulez probablement '\ d +'. –

+0

@ Frédéric Hamidi: Merci, bien attrapé. –

+0

@Thomas K, @ Frédéric Hamidi. merci, très utile. Je viens de réaliser que mon 'remplacement 'devrait être basé sur le nombre trouvé. Par exemple, si "[2345]" est trouvé, je pourrais le remplacer par quelque chose comme "[mytext, 2345]". Comment puis-je obtenir ce numéro trouvé? – rsp

1

Utilisation re.sub:

import re 
input = 'Some string [3423] of words and numbers like 9898' 
output = re.sub(r'\[[0-9]+]', '[mycustomtext]', input) 
# output is now 'Some string [mycustomtext] of words and numbers like 9898' 
+0

ne pas oublier il y a plus de 10 numéros. – Keng

+0

@Keng: De quoi parlez-vous? Mon code fonctionne très bien pour les nombres à plusieurs chiffres. –

+0

c'est vrai mais il ne fait que correspondre aux chiffres avec les chiffres 0-9; il y a plus de 10 chiffres. ; o) http://blogs.msdn.com/b/oldnewthing/archive/2004/03/09/86555.aspx http://www.moserware.com/2008/02/does-your-code-pass- turkey-test.html – Keng

0

Puisque personne d'autre saute ici je vais vous donner ma version non-Python de la regex

\[(\d{1,8})\] 

maintenant dans la pièce de rechange, vous pouvez utiliser le 'groupe passif' $ n à remplacer (où n = le nombre correspondant à la partie entre parenthèses). Celui-ci serait $ 1

Questions connexes