【问题标题】:How can I strip first and last double quotes?如何去掉第一个和最后一个双引号?
【发布时间】:2011-03-06 08:24:16
【问题描述】:

我想去掉双引号:

string = '"" " " ""\\1" " "" ""'

获得:

string = '" " " ""\\1" " "" "'

我尝试使用rstriplstripstrip('[^\"]|[\"$]'),但没有成功。

我该怎么做?

【问题讨论】:

  • 正确答案如下。至于您使用strip 的方法,请注意a)此方法不采用正则表达式作为其参数,b)您提供的正则表达式无论如何都不会起作用,c)此方法会去除所有相邻的字符,而不仅仅是一,所以你会用.strip('"')丢失两个双引号。

标签: python string strip


【解决方案1】:

Python 3.9开始,可以使用removeprefixremovesuffix

'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'

【讨论】:

    【解决方案2】:

    从字符串的开头和结尾删除确定的字符串。

    s = '""Hello World""'
    s.strip('""')
    
    > 'Hello World'
    

    【讨论】:

      【解决方案3】:

      下面的函数将去除空的 spces 并返回不带引号的字符串。如果没有引号,那么它将返回相同的字符串(已剥离)

      def removeQuote(str):
      str = str.strip()
      if re.search("^[\'\"].*[\'\"]$",str):
          str = str[1:-1]
          print("Removed Quotes",str)
      else:
          print("Same String",str)
      return str
      

      【讨论】:

        【解决方案4】:

        在您的示例中,您可以使用条带,但您必须提供空间

        string = '"" " " ""\\1" " "" ""'
        string.strip('" ')  # output '\\1'
        

        注意输出中的\'是字符串输出的标准python引号

        你的变量的值是'\\1'

        【讨论】:

          【解决方案5】:

          我有一些代码需要去掉单引号或双引号,我不能简单地用 ast.literal_eval 它。

          if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
              arg = arg[1:-1]
          

          这类似于 ToolmakerSteve 的答案,但它允许长度为 0 的字符串,并且不会将单个字符 " 变成空字符串。

          【讨论】:

            【解决方案6】:

            重要提示:我正在扩展问题/答案以去除单引号或双引号。我将这个问题解释为必须存在两个引号并匹配,才能执行剥离。否则,字符串原封不动地返回。

            要“取消引用”一个字符串表示,它可能有单引号或双引号(这是@tgray 答案的扩展):

            def dequote(s):
                """
                If a string has single or double quotes around it, remove them.
                Make sure the pair of quotes match.
                If a matching pair of quotes is not found, return the string unchanged.
                """
                if (s[0] == s[-1]) and s.startswith(("'", '"')):
                    return s[1:-1]
                return s
            

            解释:

            startswith 可以采用一个元组,以匹配多个备选方案中的任何一个。双括号(()) 的原因是我们将一个参数("'", '"') 传递给startswith(),以指定允许的前缀,而不是两个参数"'"'"',这将被解释作为前缀和(无效的)起始位置。

            s[-1] 是字符串中的最后一个字符。

            测试:

            print( dequote("\"he\"l'lo\"") )
            print( dequote("'he\"l'lo'") )
            print( dequote("he\"l'lo") )
            print( dequote("'he\"l'lo\"") )
            

            =>

            he"l'lo
            he"l'lo
            he"l'lo
            'he"l'lo"
            

            (对我来说,正则表达式并不容易阅读,所以我没有尝试扩展 @Alex 的答案。)

            【讨论】:

            • 如果首先检查第一个和最后一个字符是否相同,则只需检查第一个字符是否为引号: def strip_if_quoted(name): if name[0] == name [-1] and name[0] in ("'", '"'): return name[1:-1]
            • @TomOnTime:你说得对,这是一个很好的优化。我已经申请了。
            • 我建议处理 2 个字符或更少的字符串。现在,此函数可以为长度为 0 的字符串抛出索引越界异常。此外,您可以从长度为 1 个字符的字符串中删除引号。你可以添加一个守卫,len(s) >= 2,或者类似的东西。
            【解决方案7】:

            快完成了。引用自http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

            chars 参数是一个字符串 指定要设置的字符集 删除。

            [...]

            chars 参数不是前缀或 后缀;相反,所有的组合 它的值被剥离:

            所以参数不是正则表达式。

            >>> string = '"" " " ""\\1" " "" ""'
            >>> string.strip('"')
            ' " " ""\\1" " "" '
            >>> 
            

            请注意,这不是您所要求的,因为它会从字符串的两端吃掉多个引号!

            【讨论】:

              【解决方案8】:

              查找字符串中第一个和最后一个 " 的位置

              >>> s = '"" " " ""\\1" " "" ""'
              >>> l = s.find('"')
              >>> r = s.rfind('"')
              
              >>> s[l+1:r]
              '" " " ""\\1" " "" "'
              

              【讨论】:

                【解决方案9】:

                要删除第一个和最后一个字符,并且在每种情况下,仅当相关字符是双引号时才进行删除:

                import re
                
                s = re.sub(r'^"|"$', '', s)
                

                请注意,RE 模式与您给出的模式不同,操作是 sub ("substitute") 和一个空替换字符串(strip 是一种字符串方法,但与您的要求完全不同,正如其他答案所表明的那样)。

                【讨论】:

                • 在这里使用 RE 是矫枉过正的恕我直言。我更喜欢startsWith 的解决方案。
                • 很多 Pythonistas 对 RE 有类似的反应,这真的是不合理的——RE 速度很快。另外,您“喜欢”的解决方案,如发布的那样,做了一些完全不同的事情(仅当 both 是双引号时才删除第一个和最后一个字符 - 这似乎与 OP 的规范不同) - 如果领先并且尾随引号(如果存在)需要单独删除,该解决方案变成了 4 语句、2 条件块 - 现在 与同一工作的单个、更快的表达式相比有点过头了! -)
                【解决方案10】:

                如果你不能假设你处理的所有字符串都有双引号,你可以使用这样的:

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

                编辑:

                我确定您只是在这里使用string 作为示例的变量名,并且在您的实际代码中它有一个有用的名称,但我不得不警告您,在标准库。它不会自动加载,但如果您曾经使用过import string,请确保您的变量不会使其黯然失色。

                【讨论】:

                • 如果字符串是 '"' (只有一个双引号),这将删除单个字符。我认为这可能不是我们想要的,如果是,Walapa 可能只想删除双引号匹配。
                【解决方案11】:

                如果您确定要删除开头和结尾的 ",请执行以下操作:

                string = string[1:len(string)-1]
                

                string = string[1:-1]
                

                【讨论】:

                  【解决方案12】:

                  如果字符串总是如你所见:

                  string[1:-1]
                  

                  【讨论】:

                    【解决方案13】:

                    如果您要删除的引号总是如您所说的“第一个和最后一个”,那么您可以简单地使用:

                    string = string[1:-1]

                    【讨论】:

                    • 下面那个更安全!
                    猜你喜欢
                    • 1970-01-01
                    • 2014-11-23
                    • 2019-04-23
                    • 2014-09-16
                    • 2013-01-04
                    • 2014-04-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多