簡體   English   中英

如何找出Python正則表達式中組匹配的次數?

[英]How to find out the number of times group was matched in Python regular expressions?

元字符+ :出現一次或多次。 獲取此事件次數的一般方法是什么?

例如:

import re

x = re.finditer(r'0(10)+(20)+', '0001010202020000')
for i in iter(x):
  print(i) # <re.Match object; span=(2, 13), match='01010202020'>

我想得到: [('01', 2), ('02', 3)]由於正則表達式中的(10)+(20)+

您可以這樣做的一種方法是將每個重復捕獲組包含在另一個組中,然后您可以將外部匹配的長度除以內部匹配的長度,以確定每個內部組匹配的次數。 例如:

import re

m = re.search(r'0((10)+)((20)+)', '0001010202020000')
num_grps = len(m.groups())
for i in range(1, num_grps+1,2):
    outer = m.end(i) - m.start(i)
    inner = m.end(i+1) - m.start(i+1)
    print((m.group(i+1), outer//inner))

Output:

('10', 2)
('20', 3)

您正在使用re ,但作為將regexPyPi regex 模塊一起使用的替代方法,您可以使用相同的模式並使用對captures()進行計數,它給出了一個組的所有捕獲的列表。

import regex

x = regex.search(r'0(10)+(20)+', '0001010202020000')
res = []
for i, val in enumerate(x.groups(), 1):
    res.append((val, len(x.captures(i))))

print(res)

Output

[('10', 2), ('20', 3)]

Python 演示

正則表達式引擎不支持這個,你必須自己做。 在這種情況下,您可以捕獲重復的字符串和重復的結果,然后自己計算重復次數。

matches = re.finditer(r'0((10)+)((20)+)', '0001010202020000')
for match in matches:
    item = [(pattern, len(instance) // len(pattern))
            for instance, pattern in zip(*[iter(match.groups())]*2)]
    print(item)

請注意,它不適用於非固定子模式。 在這種情況下,您必須在匹配組本身上運行findall (或finditer )並計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM