正则表达式替换条()

时间:2016-07-25 10:17:53

标签: python regex python-3.x

很长时间/第一次。

我是一名行业的药剂师,正在通过教我自己如何使用各种语言进行编码,这些语言对我来说很有用,比如工作中的任务自动化,但主要是Python 3.x.我正在通过自动化的电子书电子书工作,并发现它很棒。

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

当我想要剥离的字符出现在我希望将其剥离的字符串中时,我陷入困境。 ' ssstestsss' .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)

如图所示,在(' ssstestsss'' s')上运行它将产生' testsss'因为。+得到了所有这些而*让它忽略了最终的' sss'。如果我将最终的*更改为+,它只会提高一点以产生' testss'。如果我让捕获组不贪婪(即(。+)?)我仍然会得到“测试”。如果从捕获组的字符类中排除要剥离的字符并删除结束字符串锚点(即re.compile('^'+_strip+'*([^'+_strip+'.]+)'+_strip+'*')我会得到'以及如果我不删除结尾字符串锚然后它显然是错误。

为冗长和漫无边际的问题道歉。

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

我希望我已经适当地提出了这个问题并且在我的搜索中没有错过任何内容。

此致

Lobsta

2 个答案:

答案 0 :(得分:3)

(.+)贪婪,(默认情况下)。只需使用(.+?)
将其更改为非贪婪 你可以在this site

测试python正则表达式

编辑:有人发表评论时,(.+?)(.+)?不会做同样的事情:(.+?)(.+)的非贪婪版本,(.+)?匹配或者不是贪婪的(.+)

答案 1 :(得分:2)

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

此外,没有.* / 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"进入正则表达式模式:如果传递_strip,则将符号放在[...]字符类中并进行转义(因为我们无法控制符号位置,所以最简单的方法,将它们全部视为文字符号)。
  • 使用re.sub,我们会删除匹配的子字符串。