Python中如何从字符串中去除引号

132

我有一段使用Google STT引擎识别语音并返回结果的Python代码,但是结果中带有双引号。由于我将使用它运行许多命令,所以我不想在我的代码中使用这些引号。目前为止,我还没有尝试任何方法。

以下是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为树莓派开发的语音命令程序。

1
你是指在Python中表示字符串的引号之外再添加引号吗?请提供相关命令和输出,以及你具体想要的结果。 - ivan7707
"[python] 去除字符串引号" 有很多重复。 - smci
8个回答

236

如果字符串中出现这些字符,只需使用字符串方法.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('\"')

4
在我的情况下,转义双引号不起作用,所以我使用了这个...a = a.strip(chr(34))。 - Dan
6
为什么你要逃避双引号(")...使用 a.strip('"') 就足够了。 - Vivek Puurkayastha
1
@VivekPuurkayastha:是的,你说得对,我转义引号既为了视觉清晰,也是出于习惯力量的考虑,这样如果它被粘贴到其他引用字符串中,它仍然是一个引号字符,而不会导致错误。 - smci

23

你可以使用 eval() 来实现这个目的。

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

虽然eval()存在风险,但我认为在这个情境下是安全的。


我得到的字符串是'\Acknowledged\',使用eval后我得到了'Acknowledged',@koliyat9811也对我有帮助。谢谢! - Sony Khan
8
literal_eval()eval()更安全。 - timvink
3
我可以问一下使用eval的风险是什么吗? - Nwoye CID
@NwoyeCID 请查阅“Python eval 安全性”;但您可以从这里开始: https://realpython.com/python-eval-function/#minimizing-the-security-issues-of-eval - Murphy
小心!evalliteral_eval都不仅仅是去掉引号 - 它们还会默默地评估字符串中的所有转义序列。有效的转义将被静默转换(eval("'\xab'")会给出'«'),而任何无效的转义或无效的语法(!!!)都将导致错误 - 尝试eval("'\user'")eval("'\images\raw'") - MisterMiyagi

11

这可以通过多种方式实现。

  • 您可以利用内置的字符串函数.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'
    >>> 
    

    8
    最简单的方法是:
    s = '"sajdkasjdsaasdasdasds"' 
    import json
    s = json.loads(s)
    

    “sajdkasjdsaasdasdasds”怎么可能是JSON对象? - goodahn
    1
    一个包含引号的字符串是一个有效的 JSON 字符串。 - Ryan
    谢谢!我再次测试了双引号并成功了! - goodahn
    请注意,JSON会自动解释几个转义序列。当仅剥离引号时,这可能不是预期的行为,并且会对任何使用\的字符串(例如Windows路径)产生意外的输出。 - MisterMiyagi

    6

    这将从您的字符串中移除第一个和最后一个引号

    import ast
    
    example = '"asdfasdfasdf"'
    result = ast.literal_eval(example)
    
    print(result)
    

    输出:

    asdfasdfasdf
    

    5
    您可以将“引号”字符替换成空字符串,像这样:

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

    在你的情况下,你可以对out变量做同样的操作。

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

    5
    字符串方法 strip()、lstrip()、rstrip() 可以实现这个功能。 - smci
    5
    lstrip()可以将左侧所有相同类型的字符全部删除。例如'""""hello'.lstrip('"') = 'hello'。但这可能不是提问者想要的结果。 - Harald Nordgren
    此外,您不认为这种方法有点天真吗?如果他想要删除的引号在字符串中间怎么办?您的解决方案会出现问题。 - Christian Dean
    @smci,我没有和你说话。我是在和Harald说话。 - Christian Dean

    3

    补充 @Christian 的评论:

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

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接