J'ai une liste de chaînes, chacune avec le modèle suivant (un ensemble de mots suivis de parenthèses entourant des mots séparés par des virgules):
pattern = r"\(.*\)" text = "vw xy zz (X, Y, Z)" re.findall(pattern, text) # ['(X, Y, Z)']
Ma sortie souhaitée est:
XXX
Je sais extraire le texte avant les parenthèses:
import re pattern = r"(^[^\(]+)" text = "vw xy zz (X, Y, Z)" re.findall(pattern, text) # ['vw xy zz ']
Je sais aussi comment extraire le texte entre parenthèses: p>
["vw xy zz", "X", "Y", "Z"]
Mais je me demande s'il existe un moyen de combiner les modèles pour obtenir le résultat souhaité en une seule fois.
3 Réponses :
([a-zA-Z]{1,2}\s){3}|[A-Z]
cette expression régulière correspondra à: ["vw xy zz", "X", "Y", "Z"]
vous pouvez le tester ici testeur de regex
const regex = /([a-zA-Z]{1,2}\s?){3}|[A-Z]/g
const text = "vw xy zz (X, Y, Z)"
const res = text.match(regex);
console.log(res)
Vous pouvez utiliser re.findall:
['vw xy zz', 'X', 'Y', 'Z']
Output:
s = "vw xy zz (X, Y, Z)"
result = [i.strip() for i in re.findall('[\w\s]+', s)]
Si les valeurs ne sont pas uniquement alphanumériques et peuvent contenir des caractères sauf des espaces et des virgules, je suggère d'utiliser une expression régulière "générique" basée sur des classes de caractères négatives:
re.findall(r'[^(),\s](?:[^(),]*[^(),\s])?', s)
Voir le démo regex .
Il n'est pas nécessaire de strip () les éléments après re.findall renvoie toutes les correspondances.
Détails
[^ (), \ s] - a classe de caractères annulée correspondant à n'importe quel caractère sauf (, ) , , et les espaces (?: [^ (),] * [^ (), \ s])? - 1 ou 0 occurrences de:
[^ (),] * - tous les caractères sauf (, ) et , li >
[^ (), \ s] - tout caractère sauf (, ) , , et les espaces très bonne réponse :)
meilleur cela correspondra exactement à ce que vous voulez
re.findall (r '[^ (), \ s] (?: [^ (),] * [^ (), \ s])?', s)- en même temps avec pas besoin de couper les articles. Autorise tous les caractères sauf les parenthèses et les virgules. Démo