如何提取正则表达式中重复组的每个元素

时间:2017-08-22 02:46:17

标签: python regex

字符串包含由' - '分隔的数字。或者' _',如何获取字符串中的每个数字?

import re
pattern = re.compile(r'\w(\d+)(?:(?:-|_)(\d+))*\w')

str='a1-2-3_4bc2-3_4d'
m = re.findall(pattern, str)
print(m)

我希望输出为[(1,2,3,4),(2,3,4)],但它给出了[(' 1',' 4' ),(' 2',' 4')]

4 个答案:

答案 0 :(得分:1)

编辑:此答案基于发布的内容。

你几乎得到了它,试试(\d+)(?:(?:-|_)(\d+))*?

*?      # (zero or more)(lazy)

答案 1 :(得分:1)

您已经在使用findall,因此您可以将正则表达式简化为:

(\d+)(?:-|_)?

在您的完整示例中,您将获得

import re
pattern = re.compile(r'(\d+)(?:-|_)?')

str='1-2-3_4'
m = re.findall(pattern, str)
print(m)

返回

['1', '2', '3', '4']

现在,如果你打算在混合中投掷字母,你可以超级简单并提取所有数字:

import re
pattern = re.compile(r'(\d+)')

str='1-2-3_4b5'
m = re.findall(pattern, str)
print(m)

那会给你

['1', '2', '3', '4', '5']

但显然,这是一个不同的比赛,而不是考虑 - 和_考虑

答案 2 :(得分:0)

这不可能在一个步骤中完成,这需要同时捕获可变数量的组;你可以试试这个:

import re
s='a1-2-3_4bc2-3_4d'

[re.findall(r'\d+', g.group()) for g in re.finditer(r'[\d_-]+', s)]
# [['1', '2', '3', '4'], ['2', '3', '4']]

答案 3 :(得分:0)

输入字符串的变体可能仍然不是很清楚,但是,根据问题中的示例字符串,您可以这样提取数字:

  • 使用re.split()
  • 将两个连续的非数字字符(\D{2} - 其中\D与非数字字符匹配)拆分
  • 从每场比赛中提取数字

演示:

In [1]: import re

In [2]: s = 'a1-2-3_4bc2-3_4d'

In [3]: [re.findall(r"\d+", item) for item in re.split(r"\D{2}", s)]
Out[3]: [['1', '2', '3', '4'], ['2', '3', '4']]