J'écris un code simple pour trouver 'bonjour' dans une chaîne même si d'autres caractères se trouvent entre ses caractères, par exemple : hpepllpoo .
Mais il y a quelques problèmes.
Mon code est:
```NO```
Pour certaines chaînes par exemple kdjhslfjhshhhheeellllllooooosadsf print YES c'est vrai.
Mais il y a un problème. Par exemple, ma chaîne est:
helhcludoo
Le résultat est
import re
x = raw_input()
if re.match(r'.*h+e+ll+o+.*',x):
print ('YES')
else:
print('NO')
mais je veux le faire correspondre et imprimer YES .
4 Réponses :
Vous pouvez faire:
In [2112]: re.search(r'h.*e(?:.*l){2}.*o', 'kdjhslfjhshhhheeellllllooooosadsf')
Out[2112]: <re.Match object; span=(3, 28), match='hslfjhshhhheeellllllooooo'>
In [2113]: re.search(r'h.*e(?:.*l){2}.*o', 'helhcludoo')
Out[2113]: <re.Match object; span=(0, 10), match='helhcludoo'>
Cela correspond essentiellement à zéro ou plusieurs caractères (. * ) entre les caractères souhaités.
{num} est un raccourci pour écrire des motifs répétitifs successifs; ici, par (?:. * l) {2} nous faisons correspondre 2 modèles successifs de . * (mis dans le groupe non capturé (?: ) ). Donc, vous pouvez également écrire:
h.*?e(?:.*?l){2}.*?o
Une autre chose est, vous pouvez utiliser . *? pour avoir la correspondance non gourmande qui doit correspondre la sous-chaîne la plus courte en premier, plutôt que de faire correspondre avidement la plus longue avec . * et d'effectuer un suivi.
h.*e.*l.*l.*o
Exemple:
h.*e(?:.*l){2}.*o
Dans votre expression régulière, vous avez utilisé + qui est censé correspondre à un ou plusieurs des jetons précédents, donc par exemple e + correspond à un ou plusieurs e ; donc votre Regex ne correspondra évidemment pas à la sous-chaîne souhaitée.
Comme l'a dit @ Jean-François Fabre, vous avez besoin d'une expression régulière: r'h.*e.*l.*l.*o.*'
Voici l'implémentation avec des cas de test pour rechercher bonjour dans une chaîne donnée:
import re
def check_hello(x):
if re.search(r'h.*e.*l.*l.*o.*',x):
return 'YES'
return 'NO'
case1 = "kdjhslfjhshhhheeellllllooooosadsf"
case2 = "helhcludoo"
case3 = "nothing here"
case4 = "in between hello here"
assert check_hello(case1) == "YES"
assert check_hello(case2) == "YES"
assert check_hello(case3) == "NO"
assert check_hello(case4) == "YES"
Une autre façon pourrait être d'utiliser une classe caractère annulé pour correspondre à un caractère tel que En utilisant re.match , vous pouvez utiliser: Si vous ne voulez pas faire correspondre les sauts de ligne, vous pouvez utiliser Par exemple: Cela imprimera: h , puis ne correspond pas au caractère suivant e 0 fois [^ e] * , puis correspond au caractère suivant e code>. YES for helhcludoo
YES for kdjhslfjhshhhheeellllllooooosadsf
NO for test helo
\ n dans la classe de caractères annulée. strings = [
"helhcludoo",
"kdjhslfjhshhhheeellllllooooosadsf",
"test helo"
]
for x in strings:
if re.match(r'.*?h[^e]*e[^l]*l[^l]*l[^o]*o',x):
print ('YES for %s' % x)
else:
print ('NO for %s' % x)
.*?h[^e]*e[^l]*l[^l]*l[^o]*o
Je propose une autre solution, n'utilisant pas d'expressions régulières. De cette façon, vous pouvez donner n'importe quel mot à rechercher.
def check(x, word):
if not word:
return "YES"
for c in x:
if c == word[0]:
word = word[1:]
if not word:
return "YES"
return "NO"
case1 = "kdjhslfjhshhhheeellllllooooosadsf"
case2 = "helhcludoo"
case3 = "nothing here"
case4 = "in between hello here"
assert check(case1, "hello") == "YES"
assert check(case2, "hello") == "YES"
assert check(case3, "hello") == "NO"
assert check(case4, "hello") == "YES"
h +correspond à plusieurshs, et non àhsuivis d'autres lettres.vous avez besoin de
h. * e. * ll. * oquelque chose comme çaVous avez la balise
python-3.xpour votre question mais utilisez la fonctionraw_inputdans votre code. Cette fonction est en Python 2 mais pas en 3. Quelle version voulez-vous vraiment? Et pensez-vous que la version de Python est importante pour cette question?@NimaAnsari Certaines des réponses fournies vous ont-elles été utiles ?