J'ai posé une question il y a un peu de temps ( python fractionnement de la chaîne inconnue par des espaces et des parenthèses ) qui ont fonctionné bien jusqu'à ce que je devais changer ma façon de penser. Je n'ai toujours pas graspégex donc j'ai besoin d'aide avec cela.
Si l'utilisateur Type Ceci: P>
J'aimerais qu'il ressemble à la sortie de la variable comme ceci: p> En d'autres termes s'il s'agit d'un mot séparé par un espace, puis divisez-le du mot suivant, s'il est entre parenthèses, puis divisez l'ensemble du groupe de mots dans le parenthèses et retirez-les. Ideme va pour les guillemets. P> J'utilise actuellement ce code qui ne répond pas à la norme ci-dessus (à partir des réponses dans le lien ci-dessus): p> Nouveau test (Test1 Test2 Test3) Test "Test5 Test6" code>
["Nouveau", "Test", "Test1 Test2 Test3", "Test", "Test", "Test5 test6"]] code> p>
>>>import re
>>>strs = "Hello (Test1 test2) (Hello1 hello2) other_stuff"
>>>[", ".join(x.split()) for x in re.split(r'[()]',strs) if x.strip()]
>>>['Hello', 'Test1, test2', 'Hello1, hello2', 'other_stuff']
5 Réponses :
Votre problème n'est pas bien défini.
Votre description des règles est p>
En d'autres termes, s'il s'agit d'un mot séparé par un espace puis divisé à partir du mot suivant, s'il est entre parenthèses, puis divisez le groupe entier des mots entre parenthèses et les supprimer. Ideme va pour les virgules. P> BlockQuote>
Je suppose que les virgules, vous voulez dire des guillemets de virgules inversées. p>
avec cette p>
xxx pré> vous devez obtenir ce p>
xxx pré> puisque tout est entouré d'inversé virgules. Très probablement, vous voulez travailler sans souci de plus grandes virgules inversées. P>
Je propose ceci, bien qu'un bot laid p>
xxx pré> obtient p>
xxx pré> p>
Oui, désolé pour les virgules et les guillemets et le fait que mon libellé n'était pas très bon, c'était une longue nuit. Le code ci-dessus fonctionnerait bien, sauf une chose, ce que j'ai essayé d'expliquer ici en d'autres termes s'il s'agit d'un mot séparé par un espace, puis divisez-le du mot suivant code> serait l'équivalent à votre < Code> ici là-bas code> dans votre code et doit être divisé en deux mots différents
'ICI "," là " code> au lieu de
" Ecoutez-le " code>.
Cela fait ce que vous attendez
Presque, il a mis la liste hors de la commande cependant, si je mettez Nouveau Test Word (test1 test2) Word Word "Test1 Test2 Tet3" Te ST code> La sortie est
['Test1 Test2', ' Test1 Test2 Tet3 ', "nouveau", "mot", "test", "mot", "mot", "te", "st"] code> qui est presque juste mais le nouveau mot sort de la place.
Désolé, j'ai raté cet ordre était en fait important
Je pensais que ce serait une donnée, la prochaine fois que je vais préciser. Y a-t-il une solution facile avec ce code?
La réponse était simplement:
re.findall('\[[^\]]*\]|\([^\)]*\)|\"[^\"]*\"|\S+',strs)
Cela pousse ce que les refusions peuvent faire. Pensez à utiliser PyparSing code> à la place. La descente récursive. Pour cette tâche, vous pouvez utiliser:
from pyparsing import *
import string, re
RawWord = Word(re.sub('[()" ]', '', string.printable))
Token = Forward()
Token << ( RawWord |
Group('"' + OneOrMore(RawWord) + '"') |
Group('(' + OneOrMore(Token) + ')') )
Phrase = ZeroOrMore(Token)
Phrase.parseString(s, parseAll=True)
Pour Python 3.6 - 3.8
J'ai eu une question similaire, mais je n'aime pas aucune de ces réponses, peut-être parce que la plupart d'entre elles sont de 2013. J'ai donc élaboré ma propre solution. P>
regex = r'\(.+?\)|".+?"|\w+' test = 'Hello Test (Test1 test2) (Hello1 hello2) other_stuff' result = re.findall(regex, test)
Jetez un coup d'œil à la correspondance gourmande et non gourmande.
@ möter avez-vous un lien pour me conduire à un didacticiel? La plupart des choses que je trouve sont des questions à ce sujet qui ne m'aident pas vraiment et je ne peux pas lire les documents de Python. Si c'est tout ce qui reste, cela devra faire.
Désolé, j'ai mal interprété la question. Mais voici un lien vers le didacticiel officiel: docs.python.org/2/library/re .html