1
votes

Python Regex pour faire correspondre l'espace ou ouvrir les parenthèses

Dans un texte plus grand, mon objectif est d'extraire ce qui suit à l'aide de regex:

  1. une combinaison de chiffres et de lettres connue (la lettre peut monter en majuscules ou en minuscules)
  2. cette combinaison peut être suivie d'un espace ou d'une parenthèse ouverte suivie d'un chiffre ou d'une lettre.

par exemple: l'exemple de texte est:

bla bla bla 123K bla bla 123k bla bla 123K (1) (e) 123k (z) (1)

le résultat requis est:

  • 123 Ko, 123 Ko, 123 Ko (1) (e), 123 Ko (z) (1)

J'ai essayé ce qui suit:

[ ]+123(K|k)+([ ]|\(\w\))

qui fonctionne pour 123K et 123k

cependant pour les parenthèses que j'ai essayé (ce qui ne ne fonctionne pas):

[ ]+123(K|k)+([ ]|(?<=\().*?(?=\),))

toute aide pour résoudre ce problème serait appréciée.

J'utilise Python 3.6

MODIFIER: J'ai réussi à modifier mon expression régulière pour qu'elle corresponde à une parenthèse après "K | k", l'expression régulière mise à jour est:

[ ]+123(K|k)+[ ]


4 commentaires

il y a une virgule dans votre expression régulière mais pas dans la chaîne d'exemple


supprimer la virgule ne fait aucune différence malheureusement


Tout d'abord, un testeur de regexp en temps réel est très utile dans ces cas. Un rapide google a trouvé ce pythex.org , mais il y en a probablement d'autres. Au-delà de cela, votre n ° 2 n'indique pas vraiment quelles sont vos exigences ici. Tout cela devient compliqué parce que pour "l'espace", vous n'avez pas besoin d'un espace correspondant, mais pour pren vous le faites. De plus, il n'est pas clair si d'autres combinaisons doivent également correspondre comme 123K (1) a ou 123Kabc (1), etc. Alors comme indiqué "123k a 1 (2) b" peut être quelque chose que vous voulez faire correspondre. Vous devez être vraiment clair sur ce que vous voulez faire correspondre et votre # 2 comme indiqué n'est pas si clair. . . au moins pour moi.


@FrankMerrow J'ai utilisé regex101.com pour tester mon expression régulière. concernant le point 2, juste pour clarifier (en ignorant le cas du point 1 pour simplifier l'explication), je m'attendrais à la combinaison suivante: 123k ou 123k (1) ou 123k (e) ou 123k (1) (e). J'ai utilisé un espace comme point de démarcation pour terminer le match.


3 Réponses :


0
votes

Je suppose que cela se rapproche de ce que vous voulez?

123(k|K)(\([0-9a-zA-Z]?\)){0,2}


0 commentaires

0
votes

Je fixe la limite de recherche pour les parenthèses ouvertes et fermées consécutives de 0 à 2 après 123 (k | K) en fonction de votre exemple.

Code

['123K', '123k', '123K(1)(e)', '123k(z)(1)']

Résultat

import re
m = re.findall('(123(k|K)(\(.\)){0,2})', 'blah blah blah 123K blah blah 123k blah blah 123K(1)(e) 123k(z)(1)')

result = [i[0] for i in m]


0 commentaires

0
votes

Pour obtenir les correspondances souhaitées, vous pouvez utiliser une classe de caractères pour faire correspondre les majuscules ou les minuscules k comme [Kk] ou utiliser re.IGNORECASE .

Si vous n'avez pas besoin des valeurs du groupe de capture pour un traitement ultérieur, vous pouvez rendre le groupe non capturant (?:

Pour faire correspondre toutes les occurrences d'une parenthèse ouvrante et fermante avec un seul mot entre les deux, vous pouvez capturer la correspondance dans un groupe et répéter le groupe 0 fois ou plus.

['123K', '123k', '123K(1)(e)', '123k(z)(1)']

Explication

  • \ b123 Correspond à 123 précédé d'une limite de mot pour éviter qu'il fasse partie d'un mot plus grand
  • [Kk] Faire correspondre un k majuscule ou minuscule
  • (?: Groupe sans capture
    • \ (\ w \) Faire correspondre un caractère de mot entre parenthèses
  • ) * Fermer le groupe et répéter plus de 0 fois

Démo Regex

Exemple de code p>

import re
regex = r"\b123k(?:\(\w\))*"
s = "blah blah blah 123K blah blah 123k blah blah 123K(1)(e) 123k(z)(1)"
print(re.findall(regex, s, re.IGNORECASE))

Sortie

\b123[Kk](?:\(\w\))*


0 commentaires