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'
4 Réponses :
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
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!
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)))
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
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")
Attention, cela ne donne pas la bonne sortie, vous avez toujours des crochets
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.
ast ressemble à une fonction pratique. Il est toujours bon de voir différentes façons de résoudre un problème. Merci mon pote
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.