正则表达式合金浓度与python

时间:2016-12-07 16:27:15

标签: python regex

我正在尝试将元素名称和数字作为正则表达式的组。即使对于最简单的情况,如图所示,我也不能:

>>> 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套,但不应该受到限制。但是,原始问题是提取数据。

2 个答案:

答案 0 :(得分:2)

问题是re.match只返回1个匹配,捕获组的数量已修复

要匹配多次出现的模式,您可以使用re.findallr'(\D*)(\d+)'模式匹配并捕获0 +非数字符号到组1,然后将1+数字组合到组2中:

re.findall(r'(\D*)(\d+)', t)

由于re.findall仅返回捕获的文本,因此您将获得一个包含2元素元组的列表。

使用PyPi正则表达式模块的替代解决方案

您可以验证一个字符串,然后轻松地捕获所有出现的多对组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')