1
votes

Regex pour rechercher du texte hors crochets, dans les articles au format [H] Texte 1 [W] Texte 2

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!


1 commentaires

Vous pouvez également rendre la correspondance un peu plus précise \[H] (.+?) \[W] (.+) Regex101.com/r/ltcJUB/1


3 Réponses :


2
votes

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+)?)


0 commentaires

2
votes

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écessaire

https://regex101.com/r/hryuRc/3


0 commentaires

2
votes

Vous 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 ligne

Dé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] (.+)

démo regex


1 commentaires

L'explication détaillée a aidé - merci beaucoup.