Dans un texte plus grand, mon objectif est d'extraire ce qui suit à l'aide de regex:
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:
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)+[ ]
3 Réponses :
Je suppose que cela se rapproche de ce que vous voulez?
123(k|K)(\([0-9a-zA-Z]?\)){0,2}
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]
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 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\))*
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.