Je cherche un moyen de capturer 2 groupes de texte, une partie "avoir" (écrite après [H] ) et une partie "envie" (écrite après [W] ).
Exemple de titre: [H] $10 [W] 100 credits
Je suis intéressé à saisir $10 et 100 credits dans des variables distinctes.
Jusqu'à présent, je n'ai travaillé que sur l'expression régulière suivante:
^(.*\](.*)\[.*)$
et cela me donne un groupe pour la première partie, mais je ne sais pas comment l'adapter pour capturer le deuxième groupe également.
Merci!
3 Réponses :
Vous pouvez envisager de capturer un H ou W entre crochets, puis faire correspondre tous les caractères autres que les crochets et les chiffres jusqu'au premier chiffre, et capturer ce nombre.
La regex peut ressembler à
import re
text = "[H] $10 [W] 100 credits"
print( dict(re.findall(r'\[([HW])][^][\d]*(\d+(?:\.\d+)?)', text)) )
# => {'H': '10', 'W': '100'}
Voir la démo regex . Pour faire correspondre tout ce qui se trouve entre crochets, remplacez [HW] par [^][]+ .
Détails Regex
\[ - a [([HW]) - Groupe 1: H ou W] - a ][^][\d]* - zéro ou plus de caractères autres que [ , ] et chiffres(\d+(?:\.\d+)?) - Groupe 2: un ou plusieurs chiffres suivis d'une séquence facultative de a . et un ou plusieurs chiffres.Voir la démo Python :
\[([HW])][^][\d]*(\d+(?:\.\d+)?)
Vous pouvez essayer une expression régulière spécifique \[H\] +([^ ]+) +\[W\] +(.+)
Avec:
\[H\] ? : le [H] suivi d'un ou d'un espace illimité([^ ]+) : le premier groupe nécessaire (tout sauf un espace)+\[W\] + : suivi d'un ou d'un espace illimité, puis du [W] , puis d'un ou d'un espace illimité(.+) : le dernier motif nécessaireVous pouvez faire correspondre [H] et capturer dans le groupe 1 un minimum de caractères. Faites ensuite correspondre [W] et capturez le reste des personnages du groupe 2.
\[H][^\S\r\n]+(.+?)[^\S\r\n]+\[W][^\S\r\n]+(.+)
Explication
\[H] Match [H] et un seul espace(.+?) Capturez le groupe 1 , faites correspondre 1+ fois n'importe quel caractère sauf une nouvelle ligne non gourmande\[W] Match [W] et un seul espace(.+) Capturez le groupe 2 , faites correspondre plus de 1 fois n'importe quel caractère sauf une nouvelle ligneDémo Regex et une démo Python
$10 100 credits
Production
import re
regex = r"\[H] (.+?) \[W] (.+)"
test_str = "[H] $10 [W] 100 credits"
matches = re.search(regex, test_str)
if matches:
variable1 = matches.group(1)
variable2 = matches.group(2)
print(variable1)
print(variable2)
Ou pour faire correspondre 1 ou plusieurs espaces sauf une nouvelle ligne après le caractère entre crochets:
\[H] (.+?) \[W] (.+)
L'explication détaillée a aidé - merci beaucoup.
Vous pouvez également rendre la correspondance un peu plus précise
\[H] (.+?) \[W] (.+)Regex101.com/r/ltcJUB/1