strip()的正则表达式替换

2024-04-26 12:05:21 发布

您现在位置:Python中文网/ 问答频道 /正文

长时间/第一次。在

我是一名药剂师,我正在学习如何用各种语言编写代码,这些语言对我工作中的任务自动化很有用,但主要是python3.x。我正在研究automatheboringstuff电子书,发现它很棒。在

我试着完成第7章中的一个练习题: “编写一个接受字符串并执行与strip()string方法相同的操作的函数。如果除了要删除的字符串之外没有传递其他参数,则将从字符串的开头和结尾删除空白字符。否则,函数的第二个参数中指定的字符将从字符串中删除。“

当我想删除的字符出现在我想从中删除的字符串中时,我遇到了这种情况,例如“ssstsss”。strip(s)

#!python3
import re

respecchar = ['?', '*', '+', '{', '}', '.', '\\', '^', '$', '[', ']']


def regexstrip(string, _strip):
    if _strip == '' or _strip == ' ':
        _strip = r'\s'
    elif _strip in respecchar:
        _strip = r'\'+_strip'
    print(_strip) #just for troubleshooting 
    re_strip = re.compile('^'+_strip+'*(.+)'+_strip+'*$')
    print(re_strip) #just for troubleshooting 
    mstring = re_strip.search(string)
    print(mstring) #just for troubleshooting 
    stripped = mstring.group(1)
    print(stripped)

如图所示,在('ssststsss','s')上运行它将生成'testsss',因为。+获得了所有这些,而*允许它忽略最后的'sss'。如果我把final*改成a+,它只会提高一点,产生“testss”。如果我使捕获组非贪婪(即(.+)?)我仍然得到'testsss',如果从捕获组的character类中排除要剥离的字符并删除结束字符串锚定(即re.compile('^'+_strip+'*([^'+_strip+'.]+)'+_strip+'*')我得到'te',如果我不删除结束字符串锚定,那么显然是错误的。在

为这个冗长而漫无目的的问题道歉。在

我故意包含了所有代码(正在工作),因为我只是在学习,所以我意识到我的代码可能相当低效,所以如果你能看到我可以改进我的代码的任何其他方面,请告诉我。我知道这段代码没有实际的应用程序,但我将把它作为一个学习练习。在

我希望我已经适当地问了这个问题,在我的搜索中没有遗漏任何东西。在

问候

罗布斯塔


Tags: 函数字符串代码re语言for参数string
2条回答

(.+)是贪婪的,(默认情况下)。{non-greedy,用this site测试python regex

编辑:正如有人评论的那样,(.+?)和{}没有做同样的事情:(.+?)是{}的非贪婪版本,而(.+)?匹配或不匹配贪婪的(.+)

正如我在评论中提到的,你没有在character类中包含特殊字符。在

另外,没有re.S/re.DOTALL修饰符的.*与换行符不匹配。您可以避免与^PATTERN|PATTERN$\APATTERN|PATTERN\Z(注意,\A匹配字符串的开头,\Z匹配字符串的最末尾,$可以在字符串中的最后一个换行符号之前匹配,因此,您不能使用$)。在

我建议你把代码压缩到

import re

def regexstrip(string, _strip=None):
    _strip = r"\A[\s{0}]+|[\s{0}]+\Z".format(re.escape(_strip)) if _strip else r"\A\s+|\s+\Z"
    print(_strip) #just for troubleshooting 
    return re.sub(_strip, '', string)

print(regexstrip(" ([no more stripping']  )  ", " ()[]'"))
# \A[\s\ \(\)\[\]\']+|[\s\ \(\)\[\]\']+\Z
# no more stripping
print(regexstrip(" ([no more stripping']  )  "))
# \A\s+|\s+\Z
# ([no more stripping']  )

参见Python demo

请注意:

  • _strip参数与=None是可选的
  • _strip = r"\A[\s{0}]+|[\s{0}]+\Z".format(re.escape(_strip)) if _strip else r"\A\s+|\s+\Z"初始化regex模式:如果_strip被传递,则符号被放在[...]字符类中并转义(因为我们无法控制符号的位置,所以最快最简单的方法是将它们都视为文字符号)。在
  • 使用re.sub,我们删除匹配的子字符串。在

相关问题 更多 >