Python 匹配括号内的数字正则表达式

Python 匹配括号内的数字正则表达式,python,regex,Python,Regex,我试图提取括号内的所有数字,如下所示: [1] [3-13] [15] 1 2 [] 我打算选择上面列表中的前三个。我要抢 1 3-13 15 我正在尝试以下正则表达式:\[[\d*-\d*]\] 我正在测试中的正则表达式,但我得到一个称为“坏字符范围”的错误。我做错了什么?请帮忙。我不熟悉regex您不需要字符类[],而是需要分组操作(): 分解如下: Outer()正在捕获paren以获取您想要的内容 \d+匹配前半个数字 内部(?:)是

我试图提取括号内的所有数字,如下所示:

    [1]
    [3-13]
    [15]
    1
    2
    []
我打算选择上面列表中的前三个。我要抢

1
3-13
15
我正在尝试以下正则表达式:
\[[\d*-\d*]\]


我正在测试中的正则表达式,但我得到一个称为“坏字符范围”的错误。我做错了什么?请帮忙。我不熟悉regex

您不需要字符类
[]
,而是需要分组操作
()

分解如下:

  • Outer()正在捕获paren以获取您想要的内容
  • \d+
    匹配前半个数字
  • 内部
    (?:)
    是非捕获父级
  • -\d+
    匹配破折号,然后匹配数字的后半部分
  • Final
    使后半部分(内部组)成为可选的

此表达式获取列表中的任何类型的数字作为值列表,如果要迭代,可以使用
re.finditer

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

编辑:添加正确答案

我会尝试使用简单的正则表达式作为-

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

或者尝试

执行此操作
\[[\d-]*\]
您可能需要跳出破折号。看看这个答案@mnciitbhu:值得注意的是,你的正则表达式最终会比你预期的匹配更多(例如,
[-3-3-3]
[]
)@Ekoji,那么你想从你的输入中匹配什么呢?@nneonno但它会匹配问题中的前三个,就像问题中一样。
(?<=\[)(([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']