2013-12-19 65 views
1

我需要捕获令牌如1112--1314-15Python的正则表达式来捕获由空格和逗号

我想拒绝包含未如12--上面指定无效的令牌的任何字符串分隔的数字和连字符和4-5-6 这些可以被任意数量的空间隔开,这些空间可能包含或可能不包含单一的彗形象差。因此,对于字符串:

43,5 67- -66,53-53 , 6

我想返回

('43', '5', '67-', '-66', '53-53', '6') 

这是我曾尝试:

import re 

num = r'\d{1,4}' 
token = r'(?:-%s)|(?:%s-%s)|(?:%s-)|(?:%s)' % (num, num, num, num, num) 
sep = r'\s*,?\s*' 
valid = r'(%s)(?:%s(%s))*' % (token, sep, token) 

test = re.compile(valid) 
m = test.match("43,5 67- -66,53-53 , 6") 
print(m.groups()) 

,但只打印第一个和最后一个号码:

('43', '6') 

任何帮助,非常感谢。

回答

5

使用re.findall

>>> re.findall(r'[-\d]+', '43,5 67- -66,53-53 , 6') 
['43', '5', '67-', '-66', '53-53', '6'] 

UPDATE

使用排除环视断言排除无效匹配。

>>> pattern = r'(?<![-\d])(\d+-\d+|-\d+|\d+-|\d+)(?![-\d])' 
>>> re.findall(pattern, '43,5 67- -66,53-53 , 1--, 2, --3, -4-') 
['43', '5', '67-', '-66', '53-53', '2'] 
+0

+1我很震惊... – thefourtheye

+0

很快就回答了这个问题,给我留下了深刻的印象!但是,我也想拒绝无效输入,例如--7和9--6。我会更新我的问题以反映这一点。 –

+0

@HolyMackerel,'-6-'怎么样? – falsetru

相关问题