Freedom Peacemaker wrote: > Hi, > main idea was to : > - get random characters word > - randomly colour letters in my word > - from this coloured word print all yellow letters > > As it is random i need to be sure that at least one letter is yellow so i > put yellow color into final variable.
Why? > This code works but randomly > generates error. And i have no idea how solve this problem. Please help me > > Traceback (most recent call last): > File "proj3", line 23, in <module> > w = "".join((colorpass[i.end()]) for i in re.finditer(re.escape(Y), > colorpass)) > File "proj3", line 23, in <genexpr> > w = "".join((colorpass[i.end()]) for i in re.finditer(re.escape(Y), > colorpass)) > IndexError: string index out of range > > This is my code: > > from random import choice > from string import ascii_letters, digits > import re > > chars = ascii_letters + digits > > word = "".join([choice(chars) for i in range(10)]) > > R = '\033[31m' # red > G = '\033[32m' # green > B = '\033[34m' # blue > P = '\033[35m' # purple > Y = '\033[93m' # yellow > > colors = [R, G, B, P, Y] > > colorpass = "\033[93m" > for char in word: > colorpass += char + choice(colors) The character is followed by the color-code sequence. If the last color is yellow re.end() == len(colorpos) which is not a valid index into the string. > print(colorpass) > > w = "".join((colorpass[i.end()]) for i in re.finditer(re.escape(Y), > colorpass)) > print(w) > > I am using Python 3.5.2 on Ubuntu 16.04 To print a colored character you have to put the color sequence before it, so I'd do just that. Here's an example without regular expressions: word = "".join(choice(chars) for i in range(10)) colored_word = "".join(choice(colors) + c for c in word) yellow_chars = "".join(part[0] for part in colored_word.split(Y)[1:]) print(word) print(colored_word) print("\033[0m", end="") print(yellow_chars) As we know that at least one character follows the color it is OK to write part[0] above. If that's not the case it's easy to avoid the exception by using part[:1] as that works for the empty string, too: >>> "foo"[:1] 'f' >>> ""[:1] '' _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor