在做url内容提取时,我碰到这个问题,要提取出:
hello&bye&你好&再见&123
中的hello bye 你好 再见 123。
我一开始想用正则表达式做,写成这样:
a = re.compile(r'^((\S+)&)*(\S+)$')
我的本意是想先匹配0个或者多个blabla&,然后最后匹配一个blabla,但是结果却是这样:
>>> a.search('再见').groups()
(None, None, '再见')
>>> a.search('你好&再见&hello&').groups()
('你好&再见&hello&', '你好&再见&hello', 'hello2')
后来我才想起来python提供的字符split('&')可以搞定,但我还是想知道怎么用正则表达式解决这个问题?
你需要的不是在表达式内部匹配多组,而是整个表达式匹配多次。
也就是说正则表达式用([^&]*)(?:&|$)
,方法用re.findall()
或re.finditer()
。
细节上看你的目的再考虑。如果出现了&&
这样的,用*
就会把空字符串匹配出来,如果用+
则不匹配。举个例子,做URL匹配的时候就倾向于用+
,这表示多个/
连起来和一个/
同义。但做有些允许空项的输入解析时,就不能丢弃空字符串。