J'ai essayé de m'apprendre à des fegex à Python et j'ai décidé d'imprimer toutes les phrases d'un texte. J'ai bricé avec les expressions régulières des 3 dernières heures en vain.
Je viens d'essayer ce qui suit mais je ne pouvais rien faire. p> Mon fichier d'entrée est comme ceci: p> ceci n'imprime pas de sorties. Mais quand je supplie "mon nom. Nom is.", Il imprime omg est-ce une question et est-ce une phrase ensemble comme s'il ne lit que la première ligne. P> Quelle est la meilleure solution de regex qui puisse Recherchez toutes les phrases dans un fichier texte - peu importe si la phrase accorde une nouvelle ligne, et lit également tout le texte? Merci. P> p>
7 Réponses :
J'ai essayé sur le Bloc-notes ++, et j'ai eu ceci:
.*$
Essayez l'inverse: diviser le texte aux limites de la phrase.
lines = re.split(r'\s*[!?.]\s*', text)
Quelque chose comme ça fonctionne: remarque comment Votre problème provient de l'utilisation du nom est. code> n'est pas dans le résultat car il ne commence pas par une lettre majuscule. P> ^ $ code> ancrages, ils fonctionnent sur tout le texte. p> p>
Merci beaucoup. Je l'ai adapté à re.Findall depuis que je dois traiter le fichier TXT. Existe-t-il un moyen d'empêcher le caractère «\ N» de venir dans le résultat? Je veux dire, dans des phrases qui portent la nouvelle ligne, que \ n apparaît entre les mots de différentes lignes.
@sarevok: Vous pouvez supprimer le \ N avant de le diviser avec text.replace ('\ n', '') code>.
Cela comprend-il également des chiffres?
Il y a deux problèmes dans votre regex: p>
^ code> et $ code>, qui sont respectivement les ancres "début de la ligne" et "fin de ligne". Cela signifie que votre motif cherche à correspondre à une ligne entière de votre texte. LI>
- Vous recherchez
\ s + code> avant votre personnage de ponctuation, qui spécifie Un ou plusieurs personnage WhitSpace . Si vous n'avez pas d'espaces avant votre ponctuation, l'expression ne correspondra pas. Li>
ol> Susceptible d'expliquer les deux choses qui posaient des problèmes et non seulement de distribuer une regex fixe.
édité: em> il fonctionnera également avec des phrases multilignes aussi. >>> t = "OMG is this a question ! Is this a sentence ? My\n name is."
>>> re.findall("[A-Z].*?[\.!?]", t, re.MULTILINE | re.DOTALL )
['OMG is this a question !', 'Is this a sentence ?', 'My\n name is.']
Vous pouvez essayer: la regex utilisée ici est [^.!?] + [.!?] code> qui tente de faire correspondre une ou plusieurs -Le délimiteur de venus suivi d'un délimiteur de phrase. p> p>
Merci CJI et Jochen Ritzel.
['I image from 08/25 through 12. ', 'The patient image 1.2, 23, 34, 45 and 64 from serise 34. ', 'It has been resected during the interval between scans. ']
Le "[A-Z]. *? [\.!?]" Avec l'espace vide est vraiment la bonne réponse, cela a résolu mon problème. Merci Ningrong Ye.
Peut-être que cela peut aider: Stackoverflow.com/questions/587345/...