长时间/第一次。在
我是一名药剂师,我正在学习如何用各种语言编写代码,这些语言对我工作中的任务自动化很有用,但主要是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',如果我不删除结束字符串锚定,那么显然是错误的。在
为这个冗长而漫无目的的问题道歉。在
我故意包含了所有代码(正在工作),因为我只是在学习,所以我意识到我的代码可能相当低效,所以如果你能看到我可以改进我的代码的任何其他方面,请告诉我。我知道这段代码没有实际的应用程序,但我将把它作为一个学习练习。在
我希望我已经适当地问了这个问题,在我的搜索中没有遗漏任何东西。在
问候
罗布斯塔
你this site测试python regex
(.+)
是贪婪的,(默认情况下)。{non-greedy,用编辑:正如有人评论的那样,}没有做同样的事情:}的非贪婪版本,而
(.+?)
和{(.+?)
是{(.+)?
匹配或不匹配贪婪的(.+)
正如我在评论中提到的,你没有在character类中包含特殊字符。在
另外,没有
re.S
/re.DOTALL
修饰符的.*
与换行符不匹配。您可以避免与^PATTERN|PATTERN$
或\APATTERN|PATTERN\Z
(注意,\A
匹配字符串的开头,\Z
匹配字符串的最末尾,$
可以在字符串中的最后一个换行符号之前匹配,因此,您不能使用$
)。在我建议你把代码压缩到
参见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
,我们删除匹配的子字符串。在相关问题 更多 >
编程相关推荐