-3
votes

Supprimer le motif de fin d'une chaîne donnée

Je veux supprimer tous les modèles de fin qui semblent être '(' suivi de lettres suivies de ')', en utilisant une expression régulière ou quelque chose qui peut fonctionner.

Mes données ressemblent à ceci:

0              H2O
1              H2O
2               F-
3          Si(OH)4

Je veux quelque chose pour supprimer les fins comme (g), (l) et (aq).

J'ai essayé quelque chose comme mais cela n'a pas fonctionné:

import re
s = re.sub('$(.)', '', s)

Je m'attends à ce que ma sortie soit:

0           H2O(g)
1           H2O(l)
2               F-
3      Si(OH)4(aq)


9 commentaires

Et quelle est la sortie que vous avez réellement ??


voulez-vous vraiment ajouter ces espaces avant le texte dans la ligne également?


Pourquoi y a-t-il un $ dans votre modèle? Pourquoi montrez-vous que (aq) disparaît alors que vous prétendez que vous ne voulez supprimer que (g) et (l) ?


je veux supprimer (aq) aussi. En fait, je veux supprimer tous les caractères qui ont un motif ('char') à la fin de la cellule


Essayez donc de modifier votre question pour la rendre plus claire


Étant donné votre commentaire sur (aq), votre réponse acceptée est erronée, vous devez la rejeter car elle est incorrecte.


avec la nouvelle clarté donnée, j'ai voté pour la réouverture car il est maintenant clair qu'avec les modifications, cette question est maintenant bien définie ... mais vous devez vraiment rejeter la réponse pour accepter cela


le seul problème sera de compter le nombre de caractères que vous avez supprimés s'il se soucie vraiment de l'alignement.


merci @hitter pour avoir signalé mon erreur ... J'ai supprimé et je re-commente car il y avait une faute de frappe dans mon copier-coller lorsque j'ai échangé a-zA-Z pour \w réponse ... la réponse de travail est s = re.sub('\([\w]*\)([\s]+|$)', r"\1", s) . notez la référence arrière pour restaurer les retours à la ligne d'espaces blancs ou la fin de la chaîne. comme mentionné ci-dessus, cela ne conduit pas à un alignement parfait mais il obtient les bonnes cordes


3 Réponses :


3
votes

Pourquoi ne pas simplement remplacer par rien, si la chaîne se termine par (l) ou (g)?

a = "H2O(l)"
new_str = remover(a, "(l)", "(g)")

éventuellement vous pourriez le mettre dans une fonction fonction:

def remover(string, *args):
    for item in args:
        if string.endswith(item):
            string = string.replace(item, '')
    return string

appel:

if a.endswith("(g)"):
    a = a.replace("(g)", '')

vous pouvez l'étendre et répertorier plusieurs caractères que vous souhaitez supprimer.


4 commentaires

c'est une façon intéressante non regex d'aller à ce sujet si la réponse est vraiment pas la suggestion regexable de belle et l' utilisation des extrémités avec ... Seul problème est que les chaînes sont immuables de sorte que votre exemple d' utilisation est mauvais ... vous avez à dire a = remover(...) ou la suppression est perdue. Corrigez cela et je vous attribuerai +1 :-) sinon votre réponse est tristement nul


C'est un point très valable - je viens d'appeler la console et évidemment cela y est imprimé ...


Bravo, j'ai changé mon vote pour un vote à la hausse! bon travail


@UpAndAdam Voulez-vous le changer pour moi aussi? Je viens de mettre en œuvre votre suggestion.



2
votes

Comme UpAndAdam l'a souligné, vous pouvez utiliser quelque chose comme cette expression régulière ajustée dans le code suivant:

0           H2O
1           H2O
2               F-
3      Si(OH)4

De plus, comme Tomerikoo l'a souligné, ce regexpr a également la même fonctionnalité:
s = re.sub('\([^(]*?\)$', '', s)
Vous pouvez remplacer cette ligne par celle du code ci-dessus et avoir toujours la même sortie.

La sortie du code susmentionné est:

import re
s = """
0           H2O(g)
1           H2O(l)
2               F-
3      Si(OH)4(aq)
"""
s = re.sub('\([\w]*\)([\s]+|$)', r"\1", s)
print(s)


19 commentaires

Cela ne correspond pas à la sortie attendue ... Je pense que vous voudriez ajouter un $ à la fin de votre modèle ....


@Tomerikoo L'op devrait également supprimer (OH) à la 4ème ligne, donc les spécifications de la question de l'OP ne sont pas vraiment claires, il n'y a donc aucune raison de voter contre l'un des répondants, en supposant que c'était vous.


@Tomerikoo s'il correspond à toutes les occurrences (de texte), au moins.


eh bien, pour commencer, je n'ai pas décliné de réponse ... Deuxièmement, la dernière ligne devrait devenir Si(OH)4 ...


@Tomerikoo J'ai compris cela, mais je pense qu'il a fait une erreur, car la sortie nécessite quelque chose de différent de sa description textuelle.


Je suis tout à fait d'accord que la question n'est pas claire (et c'est pourquoi elle est actuellement fermée ...). Mais il est possible de voir que OP signifie supprimer ces modèles à la fin des chaînes . Cependant, vous êtes très proche de cela et je vous encourage à trouver le petit ajustement pour faire fonctionner votre regex :)


Un indice: comme je l'ai suggéré, le symbole $ signifie la fin de la ligne. Et au lieu d'accepter n'importe quel caractère .* Vous voudrez peut-être vous limiter à des paranthèses non ouvrantes (


Je reprends ce qu'il a dit, puisqu'il a accepté une réponse qui ne correspond pas à son résultat attendu


en fait, c'est plus subtil que $ fait .... ne sais pas pourquoi vous utilisez le ? marquez pour être honnête cependant .... voir mon commentaire à la fin de la chaîne d'op pour une réponse correcte


@UpAndAdam Je viens d'essayer votre commentaire, votre regexpr ne fonctionne pas, comme on le voit ici prntscr.com/rblsv7


J'ai copié mal tu as raison ...


J'ai corrigé ma réponse mais les deux s'excluent mutuellement. Ma correction (commentaire / réponses) n'améliore pas votre réponse; le vôtre ne correspond pas à la sortie attendue. J'adore savoir comment vous avez décidé que je vous avais moins voté


@Tomerikoo J'ai adapté ma réponse grâce au merveilleux regexpr d'UpAndAdam, pourriez-vous restaurer ma question de -1 à 0 (la réponse est maintenant correcte.) Merci


en tant que personne qui est ici depuis longtemps, on peut faire les deux. comme tu m'as vu faire plus haut pour Anna. Vous avez eu une conversation prolongée avec un autre utilisateur. Je note votre réponse parce que je ne la trouve pas utile. Si cela change, je suis libre de le marquer. Les deux sont possibles ... et comme vous le verrez, je l'ai maintenant marqué (ce qui est un swing de 2)


Encore une fois, je n'ai pas voté contre votre réponse. Maintenant voté. Votre regex fonctionne, mais j'essayais de vous conduire à quelque chose de plus compact, tel que: \([^(]*?\)$ . N'hésitez pas à l'essayer


@Tomerikoo Désolé malentendu, je voulais dire que je pourrais utiliser un peu d'aide, car la réponse est maintenant correcte pour échapper à la perte de représentants. Mais merci d'avoir voté de toute façon, je vais intégrer votre code dans ma réponse.


@Tomerikoo qui ne fonctionne pas correctement sur l'entrée donnée bien que j'aime sa brièveté. Pourquoi est-ce que ? nécessaire, après avoir paressé ou prétendu que * était un + ... deuxièmement, le $ ne correspond qu'à la fin de la ligne, car il a triplé la chaîne sur mon interpréteur python au moins, j'ai rencontré un problème où cela ne fonctionnait que sur le tout dernier cas et ignoré les autres, d'où ma capture de groupe ... J'aurais utilisé votre réponse sans le? sinon, mais j'ai semblé rencontrer des problèmes avec '^ (' ne s'enregistrant pas correctement, j'ai donc utilisé \ w à la place


@UpAndAdam Le ? ne fait pas que le * soit comme + . Comme vous l'avez dit, cela rend les choses paresseuses . Cela semble en fait inutile maintenant, peut-être provenir d'une autre version que j'ai essayée. Le problème que vous avez rencontré avec le signe $ peut être lié aux indicateurs nécessaires. Quand je l'ai essayé ici, cela fonctionne bien. Notez qu'il utilise automatiquement l'indicateur multiligne qui est nécessaire dans ce cas


le mien ne semble pas prendre le mode multiligne, ce qui, je pense, était mon problème.



0
votes

Cela devrait pouvoir faire ce que vous voulez.

import re

s = """
0           H2O(g)
1           H2O(l)
2               F-
3      Si(OH)4(aq)
"""

s = re.sub("\(.\)", "", s)

print(s)


4 commentaires

@Tomerikoo Cette réponse ne correspond pas non plus à la sortie attendue. Je pense qu'OP nous traine.


@hitter d'accord ... C'est drôle c'est l'accepté quand il ne correspond pas à la sortie attendue


@Haalanam Souhaitez-vous voter pour d'autres réponses? Ils sont plus proches de ce que vous avez demandé.


d'accord que cela ne correspond pas à la sortie attendue car il ne coupe pas le (aq)