2015-12-14 43 views
0

我试图提取所有那些括号内如下数字:匹配括号的数字的正则表达式

[1] 
    [3-13] 
    [15] 
    1 
    2 
    [] 

我打算选择在上面的列表中前三。我想抓住

1 
3-13 
15 

我想下面的正则表达式:\[[\d*-\d*]\]

我在Link测试出的正则表达式,但我得到被称为“坏字符范围”的错误。我究竟做错了什么?请帮忙。我是新来的正则表达式

+0

做这个'\ [[\ d - ] * \]' – mnciitbhu

+0

你可能需要逃避短划线。看看这个答案 http://stackoverflow.com/questions/8833963/allow-dash-in-regular-expression – Abundance

+0

@mnciitbhu:值得注意的是,你的正则表达式最终会比你期望的匹配更多(例如' [-3-3-3]'或'[]') – nneonneo

回答

1

我会尝试简单的regex原样

(?<=\[)(([0-9]-*[0-9]*))(?=\]) 

详细

import re 

s="""[1] 
[3-13] 
[15] 
1 
2 
[3-3-3] 
[-3-3-3] 
[3-3-3-] 
3 
[]""" 

data = re.findall(r'(?<=\[)(([0-9]-*[0-9]*))(?=\])',s) 

print [i[0] for i in data] 

输出 -

['1', '3-13', '15'] 

DEMO 或尝试DEMO

-1

你不想一个字符类[],而是分组操作()

\[(\d+(?:-\d+)?)\] 

打破下来:

  • 外()被捕获括号来抓住你想要的东西
  • \d+匹配数字的前半部分
  • 内部(?:)的非捕获父母
  • -\d+比赛破折号然后数字下半年
  • 最终?使得下半年(内组)可选
0

这种表达让你任何数量的与该列表作为值的列表,如果你想遍历可能是你可以使用re.finditer

>>> print re.findall("\[(\d|\d[-]?\d+?)\]", "[1] [3-13] [15] 1 2 []") 
['1', '3-13', '15'] 

编辑:添加正确的答案

相关问题