遍历python正则表达式匹配


70

这必须比我所遇到的要容易。我的问题是变成一个看起来像这样的字符串:

ABC12DEF3G56HIJ7

进入

12 * ABC
3  * DEF
56 * G
7  * HIJ

而且,我一生无法使用REGEX匹配设计正确的循环集。问题的症结在于代码必须是完全通用的,因为我无法假设[A-Z]片段将有多长时间,[0-9]片段也将有多长时间。

感谢您的协助!


2
''.join("%s * %s\n" % (n, w) for w, n in re.findall(r'(?i)([a-z]+)(\d+)', input_string))
jfs 2012年

Answers:


115

Pythonre.findall应该适合您。

现场演示

import re

s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')

for (letters, numbers) in re.findall(pattern, s):
    print(numbers, '*', letters)

61

re.finditer如果您的数据集很大,则最好使用它,因为这样可以减少内存消耗(findall()返回所有结果的列表,finditer()逐一找到它们)。

import re

s = "ABC12DEF3G56HIJ7"
pattern = re.compile(r'([A-Z]+)([0-9]+)')

for m in re.finditer(pattern, s):
    print m.group(2), '*', m.group(1)

如果我没记错的话,此示例的最后一行应print m.group(2), '*', m.group(1)适合OP的期望输出。我认为这m.group(0)是“完全”比赛-即ABC12,DEF3,G56,HIJ7。
DaveL17

@ DaveL17您说得对,谢谢。我写这个答案的时候没多想,现在就解决了。
秘银

1
此方法的优点是,您可以按名称访问命名组,而不是按正则表达式中的位置访问(如果在正则表达式中移动了模式,这可能会更改。)
Carl G

为什么这样更好?
Jann Poppinga

@Jann Poppinga减少内存使用量。 findall得到所有结果,finditer一一得到。
秘银
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.