Python正则表达式捕获由空格和逗号分隔的数字和破折号

时间:2013-12-19 16:41:19

标签: python regex string

我需要捕获1112- -1314-15

等令牌

我希望拒绝任何包含上述未指定的无效令牌的字符串,例如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')

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

使用re.findall

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

<强>更新

使用否定的外观断言来排除无效的匹配。

>>> 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']