我正在尝试将元素名称和数字作为正则表达式的组。即使对于最简单的情况,如图所示,我也不能:
>>> import re
>>> t = "Fe35C65"
>>> m = re.match("(\D*\d+\D*\d+)", t)
>>> print(m.group(1))
Fe35C65
>>> print(m.group(0))
Fe35C65
>>> print(m)
<_sre.SRE_Match object; span=(0, 7), match='Fe35C65'>
>>>
我正在寻找的输出为
Name[0] = "Fe" Name[1]="C"
Num[0] = 35, Num[1] = 65
这里有2套,但不应该受到限制。但是,原始问题是提取数据。
答案 0 :(得分:2)
问题是re.match
只返回1个匹配,捕获组的数量已修复。
要匹配多次出现的模式,您可以使用re.findall
和r'(\D*)(\d+)'
模式匹配并捕获0 +非数字符号到组1,然后将1+数字组合到组2中:
re.findall(r'(\D*)(\d+)', t)
由于re.findall
仅返回捕获的文本,因此您将获得一个包含2元素元组的列表。
您可以验证一个字符串,然后轻松地捕获所有出现的多对组PyPi regex module,如下所示:
>>> import regex
>>> t = "Fe35C65"
>>> pat = r"(?:(\D*)(\d+))+"
>>> m = regex.fullmatch(pat, t)
>>> if m:
print(zip(m.captures(1), m.captures(2)))
[('Fe', '35'), ('C', '65')]
这一点是:
(?:(\D*)(\d+))+
匹配1次出现的(第1组)0+非数字和(第2组)1+位数(提取)regex.fullmatch
要求整个字符串与模式匹配( validation ).captures(n)
。答案 1 :(得分:0)
如果有很多可以使用它:
x="Fe35C65"
m=re.compile(r"(\D+)(\d+)")
for i in m.finditer(x):
print i.groups()
输出:
('Fe', '35')
('C', '65')