2
votes

Extraire deux modèles à la fois à l'aide de regex

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.


1 commentaires

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


3 Réponses :


1
votes

([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)


0 commentaires

1
votes

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)]


0 commentaires

3
votes

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


2 commentaires

très bonne réponse :)


meilleur cela correspondra exactement à ce que vous voulez