字符串包含由' - '分隔的数字。或者' _',如何获取字符串中的每个数字?
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')]
答案 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']]