用python浓缩regex合金

2024-05-08 19:41: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套,但不应该限制。但是,最初的问题是提取数据


Tags: nameimportre元素matchgroup情况数字
2条回答

问题是re.match只返回1个匹配,捕获组的数目是固定的

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

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

因为re.findall只返回捕获的文本,所以您将得到一个2元素元组的列表

使用PyPi regex模块的替代解决方案

您既可以验证字符串,也可以轻松地捕获具有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组)0+非数字和(第2组)1+数字的1+次出现(提取
  • regex.fullmatch要求整个字符串与模式匹配(验证
  • 捕获存储在组捕获堆栈中,可以使用.captures(n)访问

如果有很多,你可以用这个:

x="Fe35C65"
m=re.compile(r"(\D+)(\d+)")
for i in m.finditer(x):
    print i.groups()

输出:

('Fe', '35')
('C', '65')

相关问题 更多 >