循环通过 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 正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章