Comment puis-je vérifier si une chaîne 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 $ de bijoux.
Comment puis-je détecter s'il comporte des signes dollar ("$"), des virgules (",") et des chiffres?
not set(p).isdisjoint(set("0123456789$,"))
oùp
est la chaîne à tester.Réponses:
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')
[Modifier: a ajouté les
'$' in s
réponses]la source
s.find('$')!=-1
=>'$' in s
:-)any()
. Existe-t-il un moyen de faire référence au personnage trouvéc
dans un style pythonique (il semble être limité à l'intérieurany()
seulement), ou devrais-je rendre la recherche de plusieurs caractères plus explicite?r'[\d\$,]'
pour qu'il corresponde à l'un de ces caractères, et ilelse:
manque les deux-points à la fin.L'utilisateur Jochen Ritzel a répondu dans un commentaire à la réponse à cette question de l'utilisateur dappawit. Cela devrait fonctionner:
('1' in var) and ('2' in var) and ('3' in var) ...
«1», «2», etc. doivent être remplacés par les caractères que vous recherchez.
Consultez cette page dans la documentation Python 2.7 pour obtenir des informations sur les chaînes, notamment sur l'utilisation de l'
in
opérateur 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étition:
# 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
la source
Comparaison rapide des horaires en réponse au message d'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))
Production:
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, if-then est toujours beaucoup plus rapide que tout!
J'ai décidé de comparer le timing d'une longue chaîne aléatoire en fonction de certains des points valides 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))
Production:
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 tout!
la source
phrase
qu'une chaîne avec des alphabets de A à Z et que je veux imprimer quels alphabets ne sont pas présents ensemble, la chaîne utilisera-t-any()
elle mieux? ou y a-t-il un moyen court de vérifier?Cela testera si les chaînes sont constituées d'une combinaison ou de chiffres, du signe dollar et d'une virgule. C'est ça que tu cherches?
la source
'testing $tring'
, ce que je ne pense pas que le PO veut se produire.'testing $tring'
pas si lamatch
méthode est utilisée, seulement si ellesearch
est utilisée. Donc je pense que son code est bien.'$string'
biens=input("Enter any character:") if s.isalnum(): print("Alpha Numeric Character") if s.isalpha(): print("Alphabet character") if s.islower(): print("Lower case alphabet character") else: print("Upper case alphabet character") else: print("it is a digit") elif s.isspace(): print("It is space character")
else:
print ("Caractère spécial sans espace")
la source