在Python中删除字符串中的引号


73

我有一个Python代码,该代码可以使用Google STT引擎识别语音并将结果返回给我,但结果以带引号的字符串形式出现。我不希望在我的代码中加上引号,因为我将使用它来运行许多命令,但它不起作用。到目前为止,我还没有尝试过任何东西!这是python代码中的可识别语音的函数:

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

这是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

这取材于史蒂文·希克森(Steven Hickson)为Raspberry Pi开发的语音命令程序


1
您是指在Python中代表字符串的引号之外的其他引号吗?包括您拥有的命令和输出以及您特别想要的。
ivan7707 '16

“ [python]删除字符串引号”有很多重复项
smci

Answers:


147

.replace()如果它们始终出现在字符串方法中,或者.strip()仅在开始和/或结束时出现,则只需使用它们:

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('\"')

在我的情况下,转义双引号无法正常工作,因此我改用了... a = a.strip(chr(34))

13

您可以为此使用eval()

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

尽管eval()带来了风险,但我认为在这种情况下它是安全的。


也为我工作。感谢@ koliyat9811我是越来越喜欢串“\\”“通过使用eval我得到“已确认”确认的\\”
索尼汗

literal_eval()docs)比eval()
timvink

8

有几种方法可以实现。

  • 您可以使用内置的字符串函数.replace()替换给定字符串中所有出现的引号:

    >>> s = '"abcd" efgh'
    >>> s.replace('"', '')
    'abcd efgh'
    >>> 
    
  • 您可以使用字符串函数.join()和生成器表达式来删除给定字符串中的所有引号:

    >>> s = '"abcd" efgh'
    >>> ''.join(c for c in s if c not in '"')
    'abcd efgh'
    >>> 
    
  • 您可以使用正则表达式删除给定字符串中的所有引号。这具有使您可以控制何时何地删除报价的附加优点:

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

5
if string.startswith('"'):
    string = string[1:]

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

4
字符串方法strip(), lstrip(), rstrip()是为此目的。
smci 2016年

1
lstrip()从左侧删除所有相同类型的字符。'""""hello'.lstrip('"') = 'hello'。这可能不是OP想要的。
Harald Nordgren '16

另外,您不认为这种方法有点天真吗?如果他要删除的引号位于字符串的中间怎么办?您的解决方案将会中断。
Christian Dean

@smci我没有在和你说话。我在和哈拉尔德谈话。
Christian Dean

4

您可以将“引号”字符替换为空字符串,如下所示:

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

对于您的情况,可以对out变量执行相同的操作。


2

最简单的方法是:

s = '"sajdkasjdsaasdasdasds"' 
import json
s = json.loads(s)

1

要添加到@Christian的评论中:

替换字符串中的所有单引号或双引号:

s = "'asdfa sdfa'"

import re
re.sub("[\"\']", "", s)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.