我正在使用与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为空。我知道这意味着字符串的结尾,但我不知道为什么它在这个正则表达式中如此重要。
答案 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', '')
为了正确起见,您最后需要$
,但为了清晰起见,我还建议在开头使用^
(^
使意图非常明确)