le point d'interrogation rompt la fonction regex de différentes manières

2020-08-02 python html django regex

J'ai une fonction qui trouve la sous-chaîne qui commence par "@" (noms d'utilisateur), vérifie la base de données pour le nom d'utilisateur et transforme la sous-chaîne en une balise html. Mais pour une raison quelconque, s'il y a un point d'interrogation dans la chaîne, la première sous-chaîne avant le point d'interrogation n'est pas convertie.

la fonction ci-dessous trouve toutes les sous-chaînes qui commencent par le signe "@" et cela fonctionne bien:

user= re.findall(r"[@]([^¿#@$\\|]*)(?=[¿#@$\\|]|$)", string)
user= list(set(user))

et celui ci-dessous obtient les 26 premiers caractères (max username len) de chaque sous-chaîne et vérifie la base de données pour les noms d'utilisateur.

                for i in user:
                    k = i[0:26] 
                    j = k.rstrip()
                    while True:  
                        try:
                            username= User.objects.get(username = j)
                            rest = i.replace(j,"",1)
                            url=url_text(j)
                            string = re.sub(r"[@]({})(?=[¿#@$?\\|]|$)".format(i,),"¿<a class='user-link3' href='/user/{}--{}'>{}</a>{}".format(url,user.id,j,rest),string)
                            break    
                        except:
                            if " " not in j:
                                break
                            else:
                                j = j.rsplit(" ",1)[0]
                                j= j.rstrip()

Jusqu'à présent, la fonction ne s'arrête que lorsqu'il y a un «? dans la chaîne et je ne pouvais pas comprendre pourquoi, car il se comporte différemment selon la situation (aussi je ne suis pas bon en regex).

Dites que la chaîne est:

string = "@mattarello xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:https://m.youtube.com/watch?v=zIV4poUZAQo"

la fonction renvoie:

@mattarello xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:https://m.youtube.com/watch?v=zIV4poUZAQo

entrée 2:

"@mattarello xxxxxxxxxxxx?"

sortie 2 "?" est doublé:

"¿<a class='user-link3' href='/user/mattarello--2'>mattarello</a> xxxxxxxxxxxx??"

entrée 3:

"@mattarello ????"

aucune sortie du tout.

Answers

Related