2017-10-18 2 views
0

i dispose d'un fichier JSON rempli de commentaires des utilisateurs (de racler web) que je l'ai tiré en python avec pandas géantspython3 regex ne change pas « à »

import pandas as pd 

data = pd.DataFrame(pd.read_json(filename, orient=columnName,encoding="utf-8"),columns=columnName) 
data['full_text'] = data['full_text'].replace('^@ABC(\\u2019s)*[ ,\n]*', '', regex=True) 
data['full_text'] = data['full_text'].replace('(\\u2019)', "'", regex=True) 
data.to_json('new_abc_short.json',orient='records') 

Les messages ne correspondent pas complètement respectif messages en ligne. (emojis montré comme \ u0234 ou quelque chose, apostrophes comme \ u2019, barre oblique dans les liens, et les guillemets ont la barre oblique inverse

je veux les nettoyer ainsi j'ai appris quelque regex, ainsi je peux tirer dans python, nettoyer les puis les resaver à nouveau sous json dans un nom différent (pour l'instant) (https://docs.python.org/3/howto/regex.html)

la deuxième ligne permet de supprimer le pseudo twitter (si elle existe seulement au début), puis supprime si il était utilisé (par exemple @ ABC) .Si il n'y avait pas de pseudo twitter au début (peut-être utilisé au milieu du message) alors cela est conservé, puis il supprime les espaces et les virgules qui ont été laissés (à nouveau seulement au début du par exemple, "@ABC, hi there" devient "hi there". "hi there @ABC" reste le même . « @ Le twitter ABC est grand » deviendrait « twitter est grand »

troisième ligne permet de remplacer tous les apostrophes qui ne pouvait pas être montré (par exemple n \ u2019t revient à ne pas) j'ai

milliers d'enregistrements (pas tous d'entre eux ont des problèmes avec apostrophes, citations, liens, etc.), et sur la base des exemples très petits j'ai regardé, ils semblent travailler

mais mon troisième ne fonctionne pas:

data['full_text'] = data['full_text'].replace('\\"', '"', regex=True) 

Exemple de message dans le json: "full_text": "@ ABC Comment pouvez-vous \" fermez accidentellement \ « mon compte »

je veux supprimer le \ à côté des guillemets doubles il semble que le vrai message (je suppose qu'il est un caractère d'échappement que l'utilisateur n'a évidemment pas le type)

mais peu importe ce que je fais, je ne peux pas l'enlever

de mon apprentissage de la regex, "n'est pas un métacaractère. donc backslash ne devrait même pas être là. Mais de toute façon, je l'ai essayé:

\\" (which i think should be the obvious one, i have \", no special quirk in " but there is in \ so i need another back slash to escape that) 
\\\\" (some forums posts online mention needing 4 slashes 
\\\" (i think someone mention in the forum posts that they got it workin with 3) 
\\\(\") (i know that brackets provide groupings so i tried different combinations) 
(\\\\") 

tous l'expression ci-dessus i enfermé dans des guillemets simples, et ils ne travaillaient pas. Je pensais que peut-être la double citation était le problème car je n'avais qu'un seul, donc j'ai remplacé les guillemets simples avec des guillemets simples x3

'''\\"''' 

mais aucune de ces travaillé pour un seul triple guillemets soit

je garde revérifier le nouveau sauvé JSON et je continue à voir:

« full_text »: « Comment pouvez-vous \ » fermez accidentellement \ « mon compte » (ie suppression @ABC avec l'espace travaillé, mais pas le bit de barre oblique inverse)

à l'origine, je tri ed cherchant à convertir ces problèmes Unicode en utilisant encoding = "utf-8") bien que mon expérience dans ce domaine soit limitée et qu'elle continue d'échouer, donc regex est ma meilleure option

+1

Faire ceci est presque certainement la mauvaise approche. Mieux serait de trouver ce que le niveau supplémentaire d'évasion, et en utilisant le même outil pour échapper aux cordes. –

+0

@DanielH Si par outil vous voulez dire ce qui a fourni les données qui ont ensuite été sauvegardées dans json, alors ce serait en raclant twitter? Donc je suppose que je ne peux pas vraiment faire quelque chose du côté de Twitter? – user3120554

+0

Attendez ... qu'est-ce que vous obtenez quand vous dites 'print (data ['full_text'])'? –

Répondre

1

Ow, j'ai raté l'indice des pandas, donc les pandas remplacent est-ce que utilise des regex.Mais, pour être clair, str.replace ne fonctionne pas avec les regex. re.sub fait.

maintenant

  • pour correspondre à une seule barre oblique inverse, votre expression rationnelle est "\\"
  • chaîne
  • pour décrire ce regex: "\\\\"
  • lors de l'utilisation d'une chaîne brute, une double barre oblique inverse suffit: r'\\'

Si votre chaîne vraiment contient un \ precedi ng un ", une expression régulière qui ferait est:

\\(?=\") 

qui fait un test avant pour votre " (Regardez regex101).

Vous devez utiliser quelque chose comme:

re.sub(r'\\(?=\")',"",s,0) 

ou un équivalent pandas géants en utilisant cette expression régulière.

+0

L'original json que j'utilise (avant de le charger en python), si je devais l'ouvrir dans notepad ++, et trouver ce tweet, je verrais l'espace arrière avant le guillemet (j'ai vérifié quelques tweets différents, et ils souffrent tous du même problème). Je ne suis pas sûr de comprendre le \\ (? = \ "), J'ai remplacé mon expression par celle-ci (entre guillemets simples) bien que le compilateur se plaint de parenthèses déséquilibrées à la position 5 (un peu stupide, mais si je questions, j'ai ajouté dans le précédent 'r' aussi.Si fixé l'erreur, mais quand j'ai vérifié le nouveau json, le backslash était toujours là :( – user3120554

+0

si je comprends bien cette expression \\ (? = \ "), de mon link, your'e correspondant (basé sur (? = ...) pour la première et seule instance de \ "., bien que, je ne suis pas sûr de savoir comment les deux \\ font autre chose que de supprimer le caprice pour le second \ , provoquant l'expression à rechercher ofr \\ ". J'ai également remarqué que le nombre de barres obliques à l'extérieur semble contrôler cette erreur de parenthèse – user3120554

+0

j'ai même essayé ceci avec re.sub comme une fonction anonyme mais cela n'a pas fonctionné :(data [ 'full_text'] = données ['full_text']. apply (lambda x: re.sub (r '\\ (? = \ ")', '"', x)) – user3120554