6
votes

Strention de python String par des parenthèses

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>

Nouveau test (Test1 Test2 Test3) Test "Test5 Test6" code>

J'aimerais qu'il ressemble à la sortie de la variable comme ceci: p>

["Nouveau", "Test", "Test1 Test2 Test3", "Test", "Test", "Test5 test6"]] code> 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>

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


3 commentaires

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


5 Réponses :


1
votes

Votre problème n'est pas bien défini.

Votre description des règles est

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.

Je suppose que les virgules, vous voulez dire des guillemets de virgules inversées.

avec cette xxx

vous devez obtenir ce xxx

puisque tout est entouré d'inversé virgules. Très probablement, vous voulez travailler sans souci de plus grandes virgules inversées.

Je propose ceci, bien qu'un bot laid xxx

obtient xxx


1 commentaires

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 serait l'équivalent à votre < Code> ici là-bas dans votre code et doit être divisé en deux mots différents 'ICI "," là " au lieu de " Ecoutez-le ".



1
votes

Cela fait ce que vous attendez xxx


3 commentaires

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 La sortie est ['Test1 Test2', ' Test1 Test2 Tet3 ', "nouveau", "mot", "test", "mot", "mot", "te", "st"] 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?



6
votes

La réponse était simplement:

re.findall('\[[^\]]*\]|\([^\)]*\)|\"[^\"]*\"|\S+',strs)


0 commentaires

3
votes

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)


0 commentaires

0
votes

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)


0 commentaires