IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

regex ou startswith


Sujet :

Python

  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut regex ou startswith
    Bonjour,
    Je cherche à récupérer dans un fichier les chaînes comprises entre "\exercicenew{" et le "}" qui suit.
    Je pensais utiliser pour l'instant stratswidth et endswith car je ne suis pas top à l'aise avec les regex.
    Je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with open("/.../essai_exos-ref.tex",'r') as fich:
        for ligne in fich:
            print(ligne,end="----")
            print(ligne.startswith(r'\\exe'))
    J'obtiens uniquement des False :
    Code LaTeX : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    \exercicenew{S\'eparation angulaire}
    ----False
     
    ----False
     
    ----False
    \exercicenew{Doublet du sodium}
    ----False
     
    ----False
     
    ----False
    \exercicenew{\'Ecart de longueur d'onde}
    ----False
    Je suis sous Ubuntu mais je ne pense pas que ce soit le problème. Si qqn a une idée, cela doit être tout bête, je n'ai peut-être pas compris ces méthodes...

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 227
    Par défaut
    hello,
    peux-tu nous montrer le début de ton fichier ?
    Ami calmant, J.P

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Voici mon fichier en entier :
    Code LaTeX : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    \documentclass [fleqn,a4paper,openany]{book}
    \usepackage [T1]{fontenc}
    \usepackage{amssymb}
    \usepackage[usenames,dvipsnames]{pstricks}
    \usepackage[bookmarks=true,bookmarksnumbered=true,breaklinks=true,
    hypertexnames=false,colorlinks=true,linkcolor=blue,citecolor=blue,urlcolor=blue]{hyperref}
     
    \makeatletter
    \def\contentsline#1#2#3#4{%
    	\ifx\\#4\\%
    	\csname l@#1\endcsname{#2}{#3}%
    	\else
    	\csname l@#1\endcsname{\hyper@linkstart{link}{#4}{#2}\hyper@linkend}{%
    		\hyper@linkstart{link}{#4}{#3}\hyper@linkend
    	}%
    	\fi
    }
    \makeatother
     
    \begin{document}
     
     
    \newcounter{NumeroExerciceNew}
    \renewcommand{\theNumeroExerciceNew}{\thechapter .\,\arabic{NumeroExerciceNew}}
     
    \newcounter{NumeroSolutionNew}
    \renewcommand{\theNumeroSolutionNew}{\thechapter .\,\arabic{NumeroSolutionNew}}
     
    \newif\ifeleve
    %\newcounter{NumeroExerciceNew}
     
    \newcommand\exercicenew[1]{%
    	\par\medskip%
    	\stepcounter{NumeroExerciceNew}%
    	\setlength{\parindent}{0cm}%
    	\setlength{\hangindent}{0cm}%
    	\psshadowbox[linewidth=1.5pt,fillcolor=yellow!30,shadowsize=5pt,shadow=true,shadowcolor=red!20,linecolor=red,framearc=0.5]{$ \blacktriangleright $ \textbf{Exercice \thechapter .\,\arabic{NumeroExerciceNew}~: #1\ifeleve\else\label{#1-solu} \hyperref[#1-enon]{$\Rightarrow$ Corrigé}\fi}}%
    	\addcontentsline{exonew}{exercicenew}{\protect\numberline{\theNumeroExerciceNew}#1}%
    	\par
    }
    \newcommand*\seteleve[1]{%
    	\elevefalse\ifcsname eleve#1\endcsname\csname eleve#1\endcsname\fi
    }
     
     
     
    \newcommand{\solutionnew}[1]% 
    {% 
    	%\hypertarget{#1-enon}{
    	\par% 
    	\stepcounter{NumeroSolutionNew}% 
    	\medskip% 
    	\setlength{\parindent}{0cm}% 
    	\setlength{\hangindent}{0cm}% 
    	\par%
    	\psshadowbox[linewidth=1.5pt,fillcolor=blue!10,shadowsize=5pt,shadow=true,shadowcolor=blue!10,
    	linecolor=blue,framearc=0.5]{$ \blacktriangleright $ \textbf{Solution de l'exercice \thechapter .\,\arabic{NumeroSolutionNew}~: #1 %\begin{Prof} 
    			\label{#1-enon} \hyperref[#1-solu]{$\Rightarrow$ \'Enoncé}
    			%\end{Prof}
    		}
    	}
    	\addcontentsline{solnew}{solutionnew}{\protect\numberline{\theNumeroSolutionNew}#1}
    	\par%}
    }
     
     
    \section{Exercices~: Réseaux}
    \subsection{\'Enoncés}
     
    \exercicenew{Spectrom\`etre \`a r\'eseau}
     
     
    \exercicenew{S\'eparation angulaire}
     
     
    \exercicenew{Doublet du sodium}
     
     
    \exercicenew{\'Ecart de longueur d'onde}
     
     
     
    \exercicenew{Monochromateur \`a r\'eseau}
     
     
    \subsection{Corrigés}
     
    \solutionnew{Spectrom\`etre \`a r\'eseau}
     
     
    \solutionnew{S\'eparation angulaire}
     
    \solutionnew{Doublet du sodium}
     
    \solutionnew{\'Ecart de longueur d'onde}
     
     
    \solutionnew{Monochromateur \`a r\'eseau}
     
     
    \end{document}

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    En fait, pour être précis sur la finalité de mon programme, il va falloir que je parcours tous les fichiers d'un répertoire, que j'extraie les chaînes comprises entre \exercicenew{ et } ainsi que \solutionnew{ et } puis que je remplace les caractères accentués par des trucs bizarres :
    é par \'e, è par \`e, à par \`a, ...

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 227
    Par défaut
    Citation Envoyé par marco056 Voir le message
    puis que je remplace les caractères accentués par des trucs bizarres :
    é par \'e, è par \`e, à par \`a, ...
    D'après le fichier source c'est pas plutôt l'inverse ? Dans ce cas pourquoi ne pas faire un remplacement global dans tout le fichier par des replace ?

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Non, ce n'est pas l'inverse. Dans mon exemple, c'est déjà fait à la main.
    Je suis obligé de le faire dans mes titres d'exercices pour des problèmes de référence mais si je le fais pour tout le contenu de mes fichiers, cela devient franchement illisible.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    r'\\exe' dit que la chaine doit commencer par 2 backslash.

    Soit, vous n'utilisez pas de raw string et vous doublez le backslash pour l’échapper, soit vous utilisez des raw string et vous n'en mettez qu'un.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    r'\\exe' dit que la chaine doit commencer par 2 backslash.

    Soit, vous n'utilisez pas de raw string et vous doublez le backslash pour l’échapper, soit vous utilisez des raw string et vous n'en mettez qu'un.

    - W
    Ah oui, merci, je n'avais pas compris cette notion.

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 227
    Par défaut
    donc si je comprends bien tu veux par exemple transformer :
    Code LaTeX : Sélectionner tout - Visualiser dans une fenêtre à part
    \exercicenew{Spectromètre à réseau}
    en
    Code LaTeX : Sélectionner tout - Visualiser dans une fenêtre à part
    \exercicenew{Spectrom\`etre \`a r\'eseau}
    mais remplacer les accents que dans exercicenew et solutionnew

  10. #10
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Oui, du coup, j'ai fait un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dico = {"é":"\'e","è":"\`e","à":"\`a","ù":"\`u"}
    motifs = [r"\exercicenew{",r"\solutionnew{"]
    with open("/media/marco5/Disque-4To/TSI_Phys/TSI_20-21/essai_exos-ref.tex",'r') as fich:
        for ligne in fich:
            for el in motifs :
                if ligne.startswith(el):# and ligne.endswith("}"):
                    for key in dico:
                        print(ligne)
                        print(ligne.replace(key,dico[key]))
    Cela semble fonctionner mais sans doute pas optimisé...
    Reste ensuite à écrire dans le fichier, il faut que je regarde cela de plus près avec le mode "r+" il me semble.

  11. #11
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 227
    Par défaut
    tu pourrais ouvrir un nouveau fichier dans un autre répertoire et l'écrire ligne par ligne au fur et à mesure que tu lis le fichier d'entrée et modifies les lignes

  12. #12
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Oui, ou le modifier en direct, non ?
    Sachant qu'en cas de mauvaise manip, j'ai des sauvegardes ailleurs.

  13. #13
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 227
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Oui, ou le modifier en direct, non ?
    Peut-être avec in-place

  14. #14
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Pourquoi pas mais je ne suis pas certain d'être en pythpn 3.6 ou plus.
    Merci en tous les cas.

  15. #15
    Membre éclairé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2018
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2018
    Messages : 29
    Par défaut
    Un regex pour les gouverner tous!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> pattern = re.compile('(?<=\\\(exercice|solution)new{)(.*)(?=})')
    1. (?<=...) : positive lookbehind assertion : est précédée par ...
    2. \\\ : autant qu'il faut pour que ça marche!
    3. (A|B) : A ou B
    4. (...) : groupe de capture
    5. .* : tout, absolument tout, sauf la retour à la ligne
    6. (?=...) : assertion lookahead : est suivie par ...


    la doc est très compréhensible; après un regex, une fois construit, on n'y comprend plus rien, il faut le contruire bout à bout et ça passe!

    Et c'est à peu près tout!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> line = r"\solutionnew{Monochromateur \`a r\'eseau}"
    >>> pattern.search(line)
    <re.Match object; span=(13, 40), match="Monochromateur \\`a r\\'eseau">
    >>> pattern.sub('REMPLACEE', line)
    '\\solutionnew{REMPLACEE}'

  16. #16
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 227
    Par défaut
    hello,
    avec une version python 3.9 ( >= 3.6 pour utiliser module in-place) et en utilisant le motif regex de Daguhh voici un code qui a l'air de fonctionner chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import re
    import in_place
    from functools import reduce
    dico = {"é":r"\'e","è":r"\`e","à":r"\`a","ù":r"\`u"}
    motif = re.compile('(?<=\\\(exercice|solution)new{)(.*)(?=})')
    with in_place.InPlace('d:/temp/marco.tex', encoding='utf-8') as fich:
        for ligne in fich:
            if motif.search(ligne):
                ligne=reduce(lambda a, kv: a.replace(*kv), dico.items(), ligne)
            fich.write(ligne)
    et si l'on veut sauvegarder son fichier avant modification, il suffit d'utiliser le paramètre backup_ext dans la fonction InPlace comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with in_place.InPlace('d:/temp/marco.tex', encoding='utf-8',  backup_ext='.bak') as fich:
    Ami calmant, J.P

  17. #17
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    une solution de plus, à base de re.sub() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dico = {r"\'e": 'é', r'\`e': 'è', r'\`u': 'ù', r'\`a': 'à', r"\'E": 'É'}
    #dico = {'é': r"\'e", 'è': r'\`e', 'ù': r'\`u', 'à': r'\`a', 'É': r"\'E"}
     
    def fonk(data):
        a,b,c = data.groups()
        for i in dico.items():
            b = b.replace(*i)
        return a+b+c
     
    with open(infile, 'r') as f1, open(outfile, 'w') as f2:
        f2.write(re.sub(r'(\\(?:exercice|solution)new\{)(.+?)(\})', fonk, f1.read()))
    #             groups: \_____________ a ____________/\_b_/\_c/

  18. #18
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci à tous.

  19. #19
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Avec le module pypi/regex (pour avoir l'ancre \G):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import regex
     
    dico = {"é":r"\'e","è":r"\`e","à":r"\`a","ù":r"\`u"}
     
    s = r''' \exercicenew{Spectromètre à réseau} Spectromètre à réseau \solutionnew{Spectromètre à réseau} '''
     
    pat = r'''(?x)
      (?:
          \G (?!\A)
        |
          (?> [^\\]* \\ )+? (?:exercice|solution) new {
      )
      [^éèàù}]* \K [éèàù] '''
     
    print(regex.sub(pat, lambda m: dico[m.group(0)], s))

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Regex] Plusieurs motifs
    Par sissi_l dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 29/06/2004, 14h15
  2. [jakarta][regex]Matcher mot en entier.
    Par thibaut dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 26/05/2004, 13h33
  3. [Regex] Vérifier qu'une chaîne respecte une expression régulière
    Par PeteMitchell dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 13/05/2004, 14h22
  4. [regex][string] replaceAll bogué ?
    Par 7eme dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 13/11/2003, 16h36
  5. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo