循环通过 python 正则表达式匹配

Posted

技术标签:

【中文标题】循环通过 python 正则表达式匹配【英文标题】:Looping through python regex matches 【发布时间】:2012-10-03 22:11:56 【问题描述】:

这必须比我遇到的要容易。我的问题是变成这样的字符串:

ABC12DEF3G56HIJ7

进入

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

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

感谢您的帮助!

【问题讨论】:

''.join("%s * %s\n" % (n, w) for w, n in re.findall(r'(?i)([a-z]+)(\d+)', input_string)) 【参考方案1】:

Python 的 re.findall 应该适合你。

Live demo

import re

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

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

【讨论】:

【参考方案2】:

如果您的数据集很大,最好使用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 你是对的,谢谢。写这个答案的时候没想太多,现在修好了。 此方法的好处是让您可以按名称访问命名组,而不是按正则表达式中的位置(如果在正则表达式中移动模式,这可能会改变。) 为什么这样更好? @Jann Poppinga 减少内存使用。 findall 得到所有结果,finditer 得到一个一个。

以上是关于循环通过 python 正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式

python--模块之re正则表达式

python re模块 正则表达式

python正则表达式

python-正则表达式

Python之正则表达式