7
votes

Regex pour trouver toutes les phrases de texte?

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. xxx

Mon fichier d'entrée est comme ceci: xxx

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.

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.


1 commentaires

Peut-être que cela peut aider: Stackoverflow.com/questions/587345/...


7 Réponses :


0
votes

J'ai essayé sur le Bloc-notes ++, et j'ai eu ceci:

.*$


0 commentaires

0
votes

Essayez l'inverse: diviser le texte aux limites de la phrase.

lines = re.split(r'\s*[!?.]\s*', text)


0 commentaires

9
votes

Quelque chose comme ça fonctionne: xxx

remarque comment nom est. n'est pas dans le résultat car il ne commence pas par une lettre majuscule.

Votre problème provient de l'utilisation du ^ $ ancrages, ils fonctionnent sur tout le texte.


3 commentaires

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', '') .


Cela comprend-il également des chiffres?



5
votes

Il y a deux problèmes dans votre regex:

  1. Votre expression est anchored par ^ et $ , 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.
  2. Vous recherchez \ s + 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.

1 commentaires

Susceptible d'expliquer les deux choses qui posaient des problèmes et non seulement de distribuer une regex fixe.



2
votes

é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.']


0 commentaires

0
votes

Vous pouvez essayer: xxx

la regex utilisée ici est [^.!?] + [.!?] qui tente de faire correspondre une ou plusieurs -Le délimiteur de venus suivi d'un délimiteur de phrase.


0 commentaires

2
votes

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. ']


1 commentaires

Le "[A-Z]. *? [\.!?]" Avec l'espace vide est vraiment la bonne réponse, cela a résolu mon problème. Merci Ningrong Ye.