253 votes

Comment vérifier la présence de caractères spécifiques dans une chaîne de caractères ?

Comment puis-je vérifier si une chaîne de caractères contient plusieurs caractères spécifiques en utilisant Python 2 ?

Par exemple, étant donné la chaîne suivante :

Les criminels ont volé 1 000 000 $ en bijoux.

Comment puis-je détecter s'il contient des signes de dollar ("$"), des virgules (",") et des chiffres ?

1 votes

Cela signifie-t-il que chaque caractère est censé être l'un d'entre eux, ou suffit-il qu'un (ou tous) de ces caractères soit présent dans la chaîne ? Doivent-ils être dans un certain ordre (par exemple : $2,00) pour que la chaîne soit valide ?

3 votes

C'est une approche différente, not set(p).isdisjoint(set("0123456789$,")) donde p est la chaîne à tester.

0 votes

345voto

dappawit Points 3782

En supposant que votre chaîne est s :

'$' in s        # found
'$' not in s    # not found

# original answer given, but less Pythonic than the above...
s.find('$')==-1 # not found
s.find('$')!=-1 # found

Et ainsi de suite pour les autres personnages.

... ou

pattern = re.compile(r'\d\$,')
if pattern.findall(s):
    print('Found')
else
    print('Not found')

... ou

chars = set('0123456789$,')
if any((c in chars) for c in s):
    print('Found')
else:
    print('Not Found')

[Edit : ajouté le '$' in s réponses]

24 votes

s.find('$')!=-1 => '$' in s :-)

0 votes

Y-a-t-il une raison particulière pour laquelle la valeur sur les non trouvés a été conservée -1 et non 0 ?

2 votes

@akki non trouvé est -1 car 0 est l'index du premier caractère dans une chaîne de caractères. Ainsi "abc".find('a') = 0. Il serait ambigu si 0 était également la valeur non trouvée.

34voto

Abbafei Points 1177

L'utilisateur Jochen Ritzel a dit ceci dans un commentaire à une réponse à cette question de l'utilisateur dappawit. Cela devrait fonctionner :

('1' in var) and ('2' in var) and ('3' in var) ...

Les caractères '1', '2', etc. doivent être remplacés par les caractères que vous recherchez.

Voir cette page dans la documentation de Python 2.7 pour obtenir des informations sur les chaînes de caractères, notamment sur l'utilisation de l'option in pour les tests de sous-chaînes.

Mise à jour : Cela fait le même travail que ma suggestion ci-dessus avec moins de répétitions :

# When looking for single characters, this checks for any of the characters...
# ...since strings are collections of characters
any(i in '<string>' for i in '123')
# any(i in 'a' for i in '123') -> False
# any(i in 'b3' for i in '123') -> True

# And when looking for subsrings
any(i in '<string>' for i in ('11','22','33'))
# any(i in 'hello' for i in ('18','36','613')) -> False
# any(i in '613 mitzvahs' for i in ('18','36','613')) ->True

0 votes

+1 c'est plus compact que de multiples .find(), et c'est bien tant que le nombre de caractères recherchés est faible. Elle n'a cependant pas besoin des parenthèses.

1 votes

A propos des parenthèses : Je sais, mais il est plus facile pour moi de toujours les utiliser, que de toujours me souvenir de l'ordre de préséance :-).

16voto

Jesuisme Points 1401

Comparaison rapide des timings en réponse au post de Abbafei :

import timeit

def func1():
    phrase = 'Lucky Dog'
    return any(i in 'LD' for i in phrase)

def func2():
    phrase = 'Lucky Dog'
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__': 
    func1_time = timeit.timeit(func1, number=100000)
    func2_time = timeit.timeit(func2, number=100000)
    print('Func1 Time: {0}\nFunc2 Time: {1}'.format(func1_time, func2_time))

Sortie :

Func1 Time: 0.0737484362111
Func2 Time: 0.0125144964371

Le code est donc plus compact avec n'importe lequel, mais plus rapide avec le conditionnel.


EDIT : TL;DR -- Pour les longues chaînes de caractères, si-alors est toujours beaucoup plus rapide que n'importe quel autre !

J'ai décidé de comparer le timing d'une longue chaîne aléatoire en me basant sur certains des points valables soulevés dans les commentaires :

# Tested in Python 2.7.14

import timeit
from string import ascii_letters
from random import choice

def create_random_string(length=1000):
    random_list = [choice(ascii_letters) for x in range(length)]
    return ''.join(random_list)

def function_using_any(phrase):
    return any(i in 'LD' for i in phrase)

def function_using_if_then(phrase):
    if ('L' in phrase) or ('D' in phrase):
        return True
    else:
        return False

if __name__ == '__main__':
    random_string = create_random_string(length=2000)
    func1_time = timeit.timeit(stmt="function_using_any(random_string)",
                               setup="from __main__ import function_using_any, random_string",
                               number=200000)
    func2_time = timeit.timeit(stmt="function_using_if_then(random_string)",
                               setup="from __main__ import function_using_if_then, random_string",
                               number=200000)
    print('Time for function using any: {0}\nTime for function using if-then: {1}'.format(func1_time, func2_time))

Sortie :

Time for function using any: 0.1342546
Time for function using if-then: 0.0201827

If-then est presque un ordre de grandeur plus rapide que n'importe quel autre !

6voto

ajwood Points 2253

Cela permettra de vérifier si les chaînes de caractères sont composées d'une combinaison de chiffres, du signe dollar et d'une virgule. Est-ce que c'est ce que vous cherchez ?

import re

s1 = 'Testing string'
s2 = '1234,12345$'

regex = re.compile('\[0-9,$\]+$')

if ( regex.match(s1) ):
   print "s1 matched"
else:
   print "s1 didn't match"

if ( regex.match(s2) ):
   print "s2 matched"
else:
   print "s2 didn't match"

0 votes

Il n'est pas nécessaire d'échapper le $ s'il se trouve dans une classe de caractères. Cela correspondra également à 'testing $tring' et je ne pense pas que ce soit ce que le PO souhaite.

0 votes

Si je me souviens bien, ça ne correspondrait pas 'testing $tring' si le match est utilisée, uniquement si search est utilisé. Je pense donc que son code est bon.

0 votes

@dappa Il correspondra toujours '$string' bien que

4voto

Eduardo Lucio Points 51

Mon approche simple, simple, simple ! \=D

Code

string_to_test = "The criminals stole $1,000,000 in jewels."
chars_to_check = ["$", ",", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
for char in chars_to_check:
    if char in string_to_test:
        print("Char \"" + char + "\" detected!")

Sortie

Char "$" detected!
Char "," detected!
Char "0" detected!
Char "1" detected!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X