J'ai vérifié le module re en résolvant la 51e question du projet Oiler, donc j'écrirai le code FizzBuzz au lieu du mémorandum. Dans ce qui suit, j'ai essayé de (1) utiliser autant que possible des expressions régulières, et (2) d'éviter d'utiliser l'opérateur% même si je n'utilise pas d'expressions régulières.
Pour les multiples de 3, je ne pouvais pas penser à un jugement utilisant une expression régulière. Par conséquent, pour déterminer un multiple de 3, nous avons utilisé le fait que si la somme de chaque chiffre d'un multiple de 3 est répétée, le résultat final sera soit 3, 6 ou 9. Plus précisément, il a été décidé d'appeler récursivement jusqu'à ce que la somme devienne un chiffre. Quand il devient un chiffre, si le nombre est 3, 6 ou 9, il renvoie vrai, sinon il retourne faux.
def is_multiple_of_3(n):
if len(str(n)) == 1:
if str(n) in ['3', '6', '9']:
return True
else:
return False
else:
return is_multiple_of_3( reduce(lambda x,y:int(x)+int(y), str(n)))
Il est facile de déterminer un multiple de 5. En effet, le premier chiffre doit être 0 ou 5. C'est facile, donc je l'ai simplement fait en utilisant re. En guise de mise en garde, re.compile (). Match () ne frappe qu'au niveau du mot (il détermine s'il correspond au début du mot, utilisez donc re.compile (). Search () Il semble que vous deviez soit précéder la chaîne avec laquelle vous voulez frapper? *.
def is_multiple_of_5(n):
#p = re.compile('(5|0)$')
p = re.compile('\d*(5|0)$')
if p.match(str(n)):
return True
else:
return False
Quand j'ai googlé "remplacer à l'aide d'expressions régulières", l'article sur re.sub () était affiché en haut. Si vous souhaitez utiliser des expressions régulières pour le remplacement de caractères, vous devez probablement utiliser re.sub.
S'il s'agit d'un multiple de 3 et d'un multiple de 5, il s'agit d'un multiple de 15, donc aucun jugement spécial n'a été porté. Cependant, j'ai essayé d'utiliser pleinement de petites astuces telles que l'ajout d'un blanc à la fin de "Fizz" et le remplacement du blanc par "Buzz". Si cela fonctionne, FizzBuzz devrait s'afficher correctement.
import re
def is_multiple_of_3(n):
if len(str(n)) == 1:
if str(n) in ['3', '6', '9']:
return True
else:
return False
else:
return is_multiple_of_3( reduce(lambda x,y:int(x)+int(y), str(n)))
def is_multiple_of_5(n):
#p = re.compile('(5|0)$')
p = re.compile('\d*(5|0)$')
if p.match(str(n)):
return True
else:
return False
def main():
for n in range(1,101):
ret = str(n)
if is_multiple_of_3(n):
ret = re.sub('\d+', 'Fizz ', ret)
if is_multiple_of_5(n):
ret = re.sub('(\d+|\ )', 'Buzz', ret)
ret.strip(' ')
print ret
main()
Recommended Posts