130 votes

Supprimer les guillemets d'une chaîne en Python

J'ai un code python qui reconnaît la parole en utilisant le moteur STT de Google et me renvoie les résultats, mais je reçois les résultats dans des chaînes de caractères avec des "guillemets". Je ne veux pas de ces guillemets dans mon code car je vais l'utiliser pour exécuter de nombreuses commandes et cela ne fonctionne pas. Je n'ai rien essayé jusqu'à présent car je n'ai rien reçu à essayer ! Voici la fonction dans le code python qui va reconnaître la parole :

def recog():
    p = subprocess.Popen(['./speech-recog.sh'], stdout=subprocess.PIPE,
                                            stderr=subprocess.PIPE)
    global out,err
    out, err = p.communicate()
    print out

C'est speech-recog.sh :

#!/bin/bash

hardware="plughw:1,0"
duration="3"
lang="en"
hw_bool=0
dur_bool=0
lang_bool=0
for var in "$@"
do
    if [ "$var" == "-D" ] ; then
        hw_bool=1
    elif [ "$var" == "-d" ] ; then
        dur_bool=1
    elif [ "$var" == "-l" ] ; then
        lang_bool=1
    elif [ $hw_bool == 1 ] ; then
        hw_bool=0
        hardware="$var"
    elif [ $dur_bool == 1 ] ; then
        dur_bool=0
        duration="$var"
    elif [ $lang_bool == 1 ] ; then
        lang_bool=0
        lang="$var"
    else
        echo "Invalid option, valid options are -D for hardware and -d for duration"
    fi
done

arecord -D $hardware -f S16_LE -t wav -d $duration -r 16000 | flac - -f --best --sample-rate 16000 -o /dev/shm/out.flac 1>/dev/shm/voice.log 2>/dev/shm/voice.log; curl -X POST --data-binary @/dev/shm/out.flac --user-agent 'Mozilla/5.0' --header 'Content-Type: audio/x-flac; rate=16000;' "https://www.google.com/speech-api/v2/recognize?output=json&lang=$lang&key=key&client=Mozilla/5.0" | sed -e 's/[{}]/''/g' | awk -F":" '{print $4}' | awk -F"," '{print $1}' | tr -d '\n'

rm /dev/shm/out.flac

Ceci est tiré du programme Voicecommand de Steven Hickson réalisé pour Raspberry Pi.

1 votes

Voulez-vous dire des guillemets supplémentaires aux guillemets qui représentent une chaîne de caractères en Python ? Incluez la commande et la sortie que vous avez, et ce que vous voulez spécifiquement.

0 votes

Il existe de nombreux doublons pour "[python] remove string quotes".

234voto

smci Points 2818

Utilisez simplement les méthodes de type "string". .replace() s'ils se produisent partout, ou .strip() s'ils ne se produisent qu'au départ et/ou à l'arrivée :

a = '"sajdkasjdsak" "asdasdasds"' 

a = a.replace('"', '')
'sajdkasjdsak asdasdasds'

# or, if they only occur at start and end...
a = a.strip('\"')
'sajdkasjdsak" "asdasdasds'

# or, if they only occur at start...
a = a.lstrip('\"')

# or, if they only occur at end...
a = a.rstrip('\"')

4 votes

Dans ma situation, l'échappement du guillemet double n'a pas fonctionné, j'ai donc utilisé ceci à la place...a = a.strip(chr(34))

5 votes

Pourquoi vous échappez les guillemets doubles (")... en utilisant a.strip('"') est suffisant

1 votes

@VivekPuurkayastha : oui, vous avez raison, j'échappe la citation à la fois pour la clarté visuelle et par habitude, de sorte que si elle est ensuite collée dans une autre chaîne citée, elle reste un caractère de citation, et ne fait pas exploser les choses.

23voto

koliyat9811 Points 138

Vous pouvez utiliser eval() à cette fin

>>> url = "'http address'"
>>> eval(url)
'http address'

Bien que eval() pose un risque, je pense que dans ce contexte il est sûr.

0 votes

A également fonctionné pour moi. Merci @koliyat9811 J'obtenais des chaînes comme ' \\ Accusé de réception \\ En utilisant eval, j'ai obtenu 'Accusé de réception'.

8 votes

literal_eval() ( docs ) est beaucoup plus sûr que eval()

3 votes

Quel est le risque d'utiliser l'évaluation, si je puis me permettre ?

11voto

Christian Dean Points 14809

Il existe plusieurs façons d'y parvenir.

  • Vous pouvez utiliser la fonction de chaîne intégrée .replace() pour remplacer toutes les occurrences de guillemets dans une chaîne donnée :

    >>> s = '"abcd" efgh'
    >>> s.replace('"', '')
    'abcd efgh'
    >>> 
  • Vous pouvez utiliser la fonction chaîne de caractères .join() et une expression génératrice pour supprimer tous les guillemets d'une chaîne donnée :

    >>> s = '"abcd" efgh'
    >>> ''.join(c for c in s if c not in '"')
    'abcd efgh'
    >>> 
  • Vous pouvez utiliser une expression régulière pour supprimer tous les guillemets d'une chaîne donnée. Cela présente l'avantage supplémentaire de vous permettre de contrôler quand et où une citation doit être supprimée :

    >>> s = '"abcd" efgh'
    >>> import re
    >>> re.sub('"', '', s)
    'abcd efgh'
    >>>

5voto

Aza Tulepbergenov Points 374

Vous pouvez remplacer les caractères "quote" par une chaîne vide, comme ceci :

>>> a = '"sajdkasjdsak" "asdasdasds"' 
>>> a
'"sajdkasjdsak" "asdasdasds"'
>>> a = a.replace('"', '')
>>> a
'sajdkasjdsak asdasdasds'

Dans votre cas, vous pouvez faire de même pour out variable.

3voto

Harald Nordgren Points 5028
if string.startswith('"'):
    string = string[1:]

if string.endswith('"'):
    string = string[:-1]

5 votes

Les méthodes de chaîne de caractères strip(), lstrip(), rstrip() sont pour cela.

5 votes

lstrip() supprime tous les caractères du même type à gauche. '""""hello'.lstrip('"') = 'hello' . Ce n'est peut-être pas ce que souhaite le PO.

0 votes

Par ailleurs, ne pensez-vous pas que cette approche est un peu naïve ? Que se passe-t-il si les guillemets qu'il veut supprimer se trouvent au milieu de sa chaîne ? Votre solution serait cassée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X