2011-03-22 3 views
2

Il existe une chaîne contenant des chiffres et des caractères.
J'ai besoin de trouver un nombre entier (dans cette chaîne) qui contient le numéro 467033. par exemple. 1.467033777777777Rechercher dans une chaîne en Python

Merci

+0

Est-il possible d'obtenir quelques lignes de données réelles pour vous donner une réponse plus pertinente? –

+0

Merci beaucoup, mais je l'ai fait! – Nick

Répondre

1

Si vous êtes juste la recherche d'un sous-chaîne dans une autre sous-chaîne, vous pouvez utiliser in:

>>> sub_num = "467033" 
>>> my_num = "1.467033777777777" 
>>> sub_num in my_num 
True 

Cependant, je pense qu'il ya plus à votre problème que juste des chaînes à la recherche, et cela pourrait ne pas être optimal. Pouvez-vous être plus précis sur ce que vous essayez de faire?

+0

Vous avez des données (beaucoup) de calculs de physique. J'ai fait un avis bizarre - les numéros qui contiennent le numéro 467033 pourraient être très instructifs pour moi. – Nick

+0

Ainsi, il y a une chaîne -> trouver tous les nombres qui contiennent le nombre par exemple. 7 – Nick

1
import re 
a = 'e.g. 1.467033777777777\nand also 576575567467033546.90 Thanks ' 
r = re.compile('[0-9.]*467033[0-9.]*') 
r.findall(a) 
['1.467033777777777', '576575567467033546.90'] 
+0

et 8146.70337777? – eyquem

+0

Eh bien, je supposais que vous en aviez besoin avant ou après la virgule. Le plus simple serait d'écrire un certain nombre de regexes parallèles, et python devrait le compiler de façon optimale. – highBandWidth

2

Essayez ceci:

import re 

RE_NUM = re.compile('(\d*\.\d+)', re.M) 

text = 'eghwodugo83o135.13508yegn1.4670337777777773u87208t' 
for num in RE_NUM.findall(text): 
    if '467033' in num: 
     print num 

Prints:

1.4670337777777773 

/Generalized optimisés en réponse au commentaire:

def find(text, numbers): 
    pattern = '|'.join('[\d.]*%s[\d.]*' % n for n in numbers) 
    re_num = re.compile(pattern, re.M) 
    return [m.group() for m in re_num.finditer(text)] 

print find(text, ['467033', '13']) 

Impressions:

['135.13508', '1.4670337777777773'] 
+0

Ceci est un exemple décent mais peut-être coûteux en fonction de l'ensemble de données. Puisque vous scannez déjà la chaîne avec re, vous pourriez aussi bien faire cuire la valeur sentinelle dans le motif. – jathanism

+0

Oui, je suis allé pour la simplicité sur la performance - juste mis à jour la réponse avec quelque chose de plus général, pour rechercher plusieurs numéros en une seule passe. – samplebias

+0

Je ne comprends pas la remarque de jathanism -.- Dans le premier code, je ferais: '' si '467033' dans num.replace ('.', '') '' Le deuxième code empêche de faire cela. Mais peut-être n'y a-t-il pas besoin de le faire, selon ce qu'il veut. – eyquem

Questions connexes