【问题标题】:Strip() Function Using Regex使用正则表达式的 Strip() 函数
【发布时间】:2021-11-19 19:46:03
【问题描述】:

我正在尝试使用正则表达式重新创建 python 的 strip() 函数。这是Automate the Boring Stuff with Python的最后一道练习题。这是我的代码:

import re

stripChar = input('Enter character to strip: ')
context = input('Enter string to strip: ')
stripContext = None


def strip(char, string):
    if stripChar == "":
        regsp = re.compile(r'^\s+|\s+$')
        stripContext = regsp.sub("", context)
        return stripContext
    else:
        stripContext = re.sub(r'^(char)+', "", string)
        return stripContext

print(strip(stripChar, context))

在第 16 行,如果我将 (char) 替换为任何随机字符,则程序正在运行。但是,我似乎无法让自定义变量在那里工作。我在那里做错了什么?

编辑:堆栈说它是this question 的副本。不是因为它' s 纯粹围绕正则表达式而不仅仅是 Python。

【问题讨论】:

  • 你能添加任何样本输入和o/p吗?
  • 您指的不是变量。 "char" 是四个字符的文字字符串,而不是同名变量的值。考虑学习如何使用.format()。附带说明一下,如果您不多次使用它,那么编译狂欢是没有意义的。

标签: python regex


【解决方案1】:

我像这样稍微修改了你的脚本,

def strip(char, string):
    if char == "":                # not "stripChar"
        regsp = re.compile(r'^\s+|\s+$')
        stripContext = regsp.sub("", string)
        return stripContext
    else:                       # some changes are here in this else statement
        stripContext = re.sub(r'^{}+|{}+$'.format(char,char), "", strip("",string))
        return stripContext

print(strip(stripChar, context))

输出:

Enter character to strip: e
Enter string to strip:   efdsafdsaeeeeeeeeee
fdsafdsa

【讨论】:

    【解决方案2】:

    您可以使用re.sub 这样做

    import re
    
    def strip(string, chars=' \n\r\t'):
        return re.sub(r'(?:^[{chars}]+)|(?:[{chars}]+$)'.format(chars=re.escape(chars)), '', string)
    

    它使用re.escape,所以用户可以输入像\[这样对正则表达式字符串有意义的字符。它还使用 ^$ 正则表达式标记,以便仅匹配字符串开头和结尾的匹配字符组。

    【讨论】:

      【解决方案3】:

      我用这种简单的方法做到了,它对我有用。

      import re
      
      def my_strip(string, char=''):
          regex_sub = re.sub(r'^\s+|\s+$', char, string)
          return(regex_sub)
      

      【讨论】:

        【解决方案4】:

        这是一个简化版。

        import re
        def striper(x, y=""):
            if y == "":
                rex = re.compile(r'^(\s*)|(\s)*$')
                xy = rex.sub("", x)
                return xy
            else:
                stripContext = re.sub(r'^{}+|{}+|{}+$'.format(y, y, y), "", x)
                return stripContext
        print(striper('abcdfsdfdsabc', 'abc'))
        

        【讨论】:

          【解决方案5】:

          您可以使用一个可选变量进行一次编译。由于没有转义字符,因此不需要原始语句。

          import re
          
          def regexStrip(theString, stripChar='\s'):
              theRegex = re.compile(f'^({stripChar})*|({stripChar})*$')
              stripContext = theRegex.sub('', theString)
              return stripContext
          
          print(regexStrip('SpamEggsSpam','Spam'))
          print(regexStrip('SpamSpamSpam$Eggs$SpamSpamSpam','Spam'))
          print(regexStrip('    Eggs    '))
          print(regexStrip('   $ Eggs $   '))
          

          【讨论】:

            【解决方案6】:

            要拥有 lstrip 和 rstrip,只需将 Brendan 的答案改编为以下内容:

            import regex as re
            
            def lregstrip(string, chars=' \n\r\t\f\v'):
                return re.sub(r'(?:^[{chars}]+)'.format(chars=re.escape(chars)), '', string)
            
            def rregstrip(string, chars=' \n\r\t\f\v'):
                return re.sub(r'(?:[{chars}]+$)'.format(chars=re.escape(chars)), '', string)
            
            def regstrip(string, chars=' \n\r\t\f\v'):
                return rregstrip(lregstrip(string,chars),chars)
            
            candidate = "  \t hogo  hohohoh oho hohoho h         \n \f"
            print("-"+regstrip(candidate)+"-")
            

            【讨论】:

              【解决方案7】:

              我就是这样做的:

              import re
              
              def new_strip(string, argument = r'\s'):   
                  strip_regex = re.sub(re.compile(rf'^{argument}+|{argument}+$'), "", string)
                  return strip_regex
              
              print(new_strip('    4564dsf4asdfa    r68a    .\n\n\n'))
              print(new_strip('ffffffffffffffdsafhiuhfdsffffffffffffffff', 'f'))
              

              输出:

              4564dsf4asdfa    r68a    .
              dsafhiuhfds
              

              它很简单而且效果很好,因为不需要检查参数是否是空格字符,除非另有说明,否则假定它是。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-01-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多