0
votes

Comment obtenir la bonne regex?

J'essaie de créer une expression régulière combinée, mais je ne sais pas comment combiner les deux sous-expressions

  • J'ai une chaîne d'entrée comme celle-ci: 4711_001.doc
  • Pour faire correspondre ce qui suit: 4711.doc
  • Je peux faire correspondre 4711 avec cette expression: [^\_\.]*
  • Je peux faire correspondre .prt avec cette expression: \.[^.]+

Existe-t-il une sorte de ET logique pour combiner les deux expressions et faire correspondre 4711.doc? À quoi ressemblerait l'expression?

Merci d'avance! Stefan


3 commentaires

Remplacez ^([^_.]+).*(\.[^.]+)$ $1$2 , voir regex101.com/r/56A0YS/1


Je ne sais pas pourquoi tout le monde pense que la question concerne Python :) Quel est votre environnement de codage?


@ WiktorStribiżew Je n'avais pas réalisé que la question ne concernait pas Python avant d'avoir lu votre commentaire. J'espère que Stefan J. comprend Python.


3 Réponses :


3
votes

Vous pouvez utiliser des groupes pour le faire dans une seule expression régulière. Consultez ce code pour référence:

4711.doc

Production:

import re
s = "4711_001.doc"
match = re.search(r"(.+?)_\d+(\..+)", s)
print(match.group(1) + match.group(2))


0 commentaires

1
votes

Une autre possibilité serait de faire correspondre la partie que vous ne voulez pas:

import re
s = "4711_001.doc"
match = re.sub(r"_\d+", "", s)
print(match)

Et remplacez-le par "" :

_\d+

Voir la démo en ligne


0 commentaires

1
votes

Pour cet exemple de chaîne 4711_001.doc , l'utilisation de [^_.]* Et \.[^.]+ Est une correspondance assez large car elle peut correspondre à n'importe quel caractère sauf ce qui est répertorié dans la classe de caractères.

Peut-être pourriez-vous rendre le motif un peu plus spécifique, en faisant correspondre les chiffres au début et les caractères du mot comme extension.

Dans le remplacement, utilisez les groupes de capture 1 et 2, souvent désignés par $1$2 ou \1\2

[^_.]*\K_[^._]+(?=\.[^.]+$)

Démo Regex

Il n'y a pas de langue marquée, mais si par exemple \K est pris en charge pour effacer le tampon de correspondance, cela peut également être une option (y compris les parties que vous avez essayées)

Dans le remplacement, utilisez une chaîne vide.

(\d+)_\d+(\.\w+)

En pièces détachées

  • [^_.]*\K Correspond à la partie avant le trait de soulignement, puis oubliez ce qui est mis en correspondance jusqu'à présent
  • _[^._]+ Correspond au trait de soulignement, suivi de 1+ caractères autres que . et _
  • (?=\.[^.]+$) Une assertion d'anticipation positive pour s'assurer que ce qui est à droite est a . suivi de tout caractère autre que a . jusqu'à la fin de la chaîne.

Démo Regex


0 commentaires