使用正则表达式在python中自定义strip()

时间:2016-03-06 17:41:27

标签: python regex

我正在使用与strip()相同的功能。

def strip(string, chars = None):
        if chars == None:
        regexOne = re.compile(r'(\w+(\s\w+)*)')
        mo = regexOne.search(string)
        return mo.group()
    else:
        regexTwo = re.compile(r'([' + chars + ']*)(.*?)([' + chars + ']*)$')
        mo = regexTwo.search(string)
        return mo.group(2)

实际上它有效但我无法理解为什么我必须将$放在regexTwo的末尾,只有当它存在时它才有效,没有它,group2为空。我知道这意味着字符串的结尾,但我不知道为什么它在这个正则表达式中如此重要。

2 个答案:

答案 0 :(得分:0)

模式末尾的$告诉匹配必须发生,直到字符串结束。

实际上,请尝试使用您的函数

s1 = "  ABC   DEF GHI   "
def strip(string, chars = None):
  if chars == None:
    regexOne = re.compile(r'(\w+(\s\w+)*)')
    mo = regexOne.search(string)
    return mo.group()
  else:
    regexTwo = re.compile(r'([' + chars + ']*)(.*?)([' + chars + ']*)$')
    mo = regexTwo.search(string)
    return mo.group(2)

print strip( s1 )
print s1.strip()

打印

ABC
ABC   DEF GHI

两个结果不一样。

答案 1 :(得分:0)

如果没有$,您的正则表达式可以有效地匹配三个组中任何一个的0个字符。

第一组使用贪婪的*,因此可以使用的任何字符都是。

第二组使用非贪婪的*?,因此如果可以消耗0个字符,则将消耗0个字符。那是你问题的根源。

使用您的示例:

>>> import re
>>> re.search(r'([The]*)(.*?)([The]*)', 'ThePythonThe').groups()
('The', '', '')

这将消耗第一组中的The。然后在第二组中不会消耗任何东西,因为*?是非贪婪的,因此当第三组发现它也可以无效地匹配时,它将尝试消耗任何东西并成功。

对于$,第3组必须在字符串的末尾结束,第2组尽可能小,因为它不贪婪:

>>> import re
>>> re.search(r'([The]*)(.*?)([The]*)$', 'ThePythonThe').groups()
('The', 'Python', 'The')

如果*?已更改为*,则第2组将因贪婪而消耗所有可能的字符,而第3组将永远不会包含任何字符:

>>> re.search(r'([The]*)(.*)([The]*)$', 'ThePythonThe').groups()
('The', 'PythonThe', '')

为了正确起见,您最后需要$,但为了清晰起见,我还建议在开头使用^^使意图非常明确)