3
votes

Existe-t-il un moyen de supprimer des combinaisons spécifiques de ponctuation dans une chaîne?

J'ai répété sur de la soupe que j'ai grattée, et une partie des données dont j'ai besoin est si près d'avoir raison, mais je n'arrive pas à nettoyer la dernière partie. Y a-t-il un moyen simple pour ce qui suit.

J'ai essayé d'utiliser re et join, mais aucun des deux ne fonctionne, car la façon dont la ponctuation apparaît est variée.

I want to turn this:
"['Coming To ', America]", "['Captain ', America, ': The Winter...']", 
"[America, 'n Pie']", "[America, 'n Made']"

Into this:
'Coming To America', 'Captain America: The Winter...', 'American Pie', 
'American Made'


2 commentaires

Pour correspondre aux caractères que vous souhaitez supprimer, l'expression régulière serait: (["[} +) (["]] +). Le format de votre entrée compte cependant, est-ce un tableau?


C'est une liste sur laquelle je boucle pour créer une liste de tuples. Je suis en train de parcourir la liste pendant que je construis la liste des tuples.


4 Réponses :


1
votes

utilisez map () sur la liste et filter () sur chaque chaîne de la liste:

['Coming To  America', 'Captain  America : The Winter...', 'America n Pie', 'America n Made']

Sorties: p>

lst = ["['Coming To ', America]", "['Captain ', America, ': The Winter...']", 
    "[America, 'n Pie']", "[America, 'n Made']"]
punct = set(list("[],'\n"))
print(list(
    map(lambda s: ''.join(filter(lambda c: c not in punct, s)), lst)
))

si vous souhaitez supprimer d'autres caractères, ajoutez-les simplement à punct


5 commentaires

Le problème avec cela est que je me retrouve avec un certain nombre d'espaces indésirables. Merci pour votre contribution


Eh bien, votre problème n'est pas seulement de vous débarrasser de la ponctuation, c'est beaucoup plus difficile que cela, par exemple, prenez America n Pie comment le programme est-il censé savoir que vous voulez dire tarte américaine < / code>, que se passe-t-il s'il est vraiment destiné à être America n Pie ?


Exactement, je l'ai déjà répété à partir d'une structure plus complexe. Mais, il se peut que j'ai fait une erreur plus tôt et maintenant je ne peux pas obtenir exactement ce que je veux.


ce que vous voulez est plus un problème de PNL


Il s'avère que j'utilisais .content au lieu de .text de BeautifulSoup. Merci pour l'aide quand même!



1
votes

Comme vous lisez probablement du code python à partir d'un fichier, vous devriez utiliser eval car c'est la méthode la plus générique pour calculer ce que vous voulez.

Cela évite d'ajouter une nouvelle ligne de remplacement à chaque fois qu'un nouveau caractère apparaît (comme sous forme d'onglets ou de parenthèses), mais cela conduit également à des failles de sécurité si vous ne faites pas attention à ce que vous faites

La fonction eval permet à un programme Python d'exécuter du code Python en lui-même.

Vous devez définir la variable America pour en faire une instruction python valide, puis vous pouvez évaluer ceci dans une liste, puis joindre chaque partie

Coming To America
Captain America: The Winter...
American Pie
American Made

Sortie:

s = ["['Coming To ', America]", "['Captain ', America, ': The Winter...']", "[America, 'n Pie']", "[America, 'n Made']"]
America = 'America'
for x in s:
    print(''.join(eval(x)))


2 commentaires

Cette fonction d'évaluation semble très pratique! Merci mon pote.


La fonction eval est dangereuse, je pense qu'il est préférable d'utiliser une autre fonction d'analyse comme json.loads ou ast



0
votes

La fonction que vous voulez est la méthode replace des chaînes.

Sa syntaxe est comme ceci:

a = ["['Coming To ', America]", "['Captain ', America, ': The Winter...']",  "[America, 'n Pie']", "[America, 'n Made']"]

result = []
toRemove = ["', ", ", '", "'", "[", "]"]
for element in a:
  b = element
  for punct in toRemove:
    b = b.replace(punct, "")
  result.append(b)
print("\n".join(result))

Donc, en utilisant cela pour résoudre votre problème ressemblerait à ceci:

newString = oldString.replace("oldSubstring", "newSubstring")


1 commentaires

Attention, cela ne donne pas la bonne sortie, vous avez toujours des crochets



1
votes

Utiliser ast pour cela peut être en faire trop, mais de toute façon voici un moyen:

Coming To America
Captain America: The Winter...
American Pie
American Made

Sortie:

import ast

# AST visitor that transforms names into strings
class NamesAsStrings(ast.NodeTransformer):
    def visit_Name(self, node):
        return ast.copy_location(ast.Str(
            s=node.id,
            ctx=node.ctx
        ), node)

ss = ("['Coming To ', America]",
      "['Captain ', America, ': The Winter...']",
      "[America, 'n Pie']",
      "[America, 'n Made']")
visitor = NamesAsStrings()
strs = [''.join(ast.literal_eval(visitor.visit(ast.parse(s)).body[0].value)) for s in ss]
print(*strs, sep='\n')

Cela ne fonctionne que si des éléments non-string (ici America ) sont des noms Python valides. Cependant, il a l'avantage de traiter correctement les caractères échappés dans les chaînes.


1 commentaires

ast ressemble à une fonction pratique. Il est toujours bon de voir différentes façons de résoudre un problème. Merci mon pote