如何获得一行中每组正则表达式的重复次数?

时间:2019-10-01 01:00:22

标签: python regex

我如何使用python获取正则表达式中每个组的重复次数,并获取此组的列表?

例如:
字符串(ab)*.*?(cd)*上的此正则表达式ababababcdcddscdcdfscdcd
应该为第一组返回4,因为ab在字符串中存在4次。
并为第二组返回6,因为cd在字符串中存在6次。

此函数或另一个函数也应该返回组列表和该行的另一部分。对于此字符串,它必须以[ab,ab,ab,ab,cd,cd,ds,cd,cd,fs,cd,cd]列出。我尝试使用匹配对象,但是找不到找到每个组重复次数的方法。

非常感谢大家的帮助。

2 个答案:

答案 0 :(得分:0)

量化捕获组时,它仅捕获第一个匹配项,而不是所有匹配项,因此无法获得[ab, ab, ab, ab, ...]

您将量词放在一个组中,以便所有重复都被立即捕获。

((ab)*).*?((cd)*)

捕获组将是:

["abababab", "ab", "cdcdcdcdcdcd", "cd"]

您可以将偶数元素的长度除以下一个元素的长度,以获得重复次数。

答案 1 :(得分:0)

在您的模式中,您正在重复一个捕获组,这将为您提供组中最后一次迭代的值。因此,例如,(ab)*这部分将包含最后一次出现的ab的值。

matched ()()()
        abababab
              () captured

一种选择是使用捕获组(ab|cd)在ab或cd上拆分以保留定界符并从结果中删除空条目。

例如

import re
s = "ababababcdcddscdcdfscdcd"
pattern = r"(ab|cd)"
result = list(filter(None, re.split(pattern, s)))
print(result)

输出

['ab', 'ab', 'ab', 'ab', 'cd', 'cd', 'ds', 'cd', 'cd', 'fs', 'cd', 'cd']

Python demo