JoeJoy 发表于 2020-7-21 21:52:18

正则表达式循环遍历匹配并计数

想请问一下大佬使用正则表达式时,如何循环原表达式,从而得到匹配表达式出现了几次?

例如:
pattern = '11\d\d\d11'
yuan='11000111111111'
re.search(pattern,yuan)


请问这种情况如何得到pattern出现了多少次?

Twilight6 发表于 2020-7-21 22:09:35




可以这样:

import re

pattern = '11\d\d\d11'
yuan='11000111111111'
pointer = 0
count = 0
while re.search(pattern,yuan):
    pointer = re.search(pattern,yuan).span()[-1]
    yuan = yuan
    count += 1
print('一共匹配了%d次'%count)

JoeJoy 发表于 2020-7-21 22:25:09

Twilight6 发表于 2020-7-21 22:09
可以这样:

11000111111111,可以不用匹配过就不算,例如,11000111111111,11000111111111,这样也可以。那这样怎么得到呢?

Twilight6 发表于 2020-7-21 22:28:05

JoeJoy 发表于 2020-7-21 22:25
11000111111111,可以不用匹配过就不算,例如,11000111111111,11000111111111,这样也可以。那这样怎 ...

我写的就是匹配过的就不算了呀,因为每次都是从上次匹配到的末尾的下一个字符开始的

JoeJoy 发表于 2020-7-21 22:29:15

本帖最后由 JoeJoy 于 2020-7-21 22:34 编辑

Twilight6 发表于 2020-7-21 22:28
我写的就是匹配过的就不算了呀,因为每次都是从上次匹配到的末尾的下一个字符开始的

嗯嗯,我看到你写的是这样子。
我问的是不用匹配过了就抛弃,有些可以连着用

例如:
pattern='11\d\d\d\d\d\d\d\d\d11'
matter='110111111011110111000110111110'

110111111011110111000110111110

110111111011110111000110111110

110111111011110111000110111110

......

这种形式

Twilight6 发表于 2020-7-21 22:32:29

JoeJoy 发表于 2020-7-21 22:29
嗯嗯,我看到你写的是这样子。
我问的是不用匹配过了就抛弃,有些可以连着用


第一次:11000111111111
第二次:11000111111111
第三次:11000111111111
第四次:11000111111111
你想要这种效果?

import re

pattern = '11\d\d\d11'
yuan='11000111111111'
pointer = 0
count = 0
while re.search(pattern,yuan):
    pointer = re.search(pattern,yuan).span() + 1
    yuan = yuan
    count += 1
print('一共匹配了%d次'%count)

JoeJoy 发表于 2020-7-21 22:35:06

Twilight6 发表于 2020-7-21 22:32
第一次:11000111111111
第二次:11000111111111
第三次:11000111111111


是的,这种效果

JoeJoy 发表于 2020-7-21 22:37:04

Twilight6 发表于 2020-7-21 22:32
第一次:11000111111111
第二次:11000111111111
第三次:11000111111111


可是这个用在我刚才发的一个新的情况又不太行了

Twilight6 发表于 2020-7-21 22:38:07

JoeJoy 发表于 2020-7-21 22:37
可是这个用在我刚才发的一个新的情况又不太行了

晚上我图片加载不出来,你发代码吧

JoeJoy 发表于 2020-7-21 22:39:00

Twilight6 发表于 2020-7-21 22:32
第一次:11000111111111
第二次:11000111111111
第三次:11000111111111


例如:
pattern='11\d\d\d\d\d\d\d\d\d11'
matter='110111111011110111000110111110'

110111111011110111000110111110

110111111011110111000110111110

110111111011110111000110111110

......

这种形式刚才试了试不太行,这个怎么搞呢?

JoeJoy 发表于 2020-7-21 22:43:18

Twilight6 发表于 2020-7-21 22:38
晚上我图片加载不出来,你发代码吧

在五楼,那个情况,你可以看到么?

Twilight6 发表于 2020-7-21 23:29:32



去休息了,暂时就帮你到这了哈

nahongyan1997 发表于 2020-7-22 16:22:18

本帖最后由 nahongyan1997 于 2020-7-22 16:33 编辑

这个我就推荐一种思路,很简单,每次匹配之后删掉原字符串中匹配到的字符串的第一个字符与匹配到的字符串前面的所有的字符,

因为 search 是从左往右搜索的,这样可以保证匹配结果的不重复性与重用性。


如果您对我的答案感到满意,请设置最佳答案!

yjsx86 发表于 2020-7-22 18:07:10

import re

pattern = r'11\d\d\d\d\d\d\d\d\d11'
string = '110111111011110111000110111110'
index = 0
while True:
    r = re.search(pattern, string)
    if r is None:
      break
      
    distance = r.span()-r.span()
    fore = string[:index+r.span()]
    content = string
    rear = string
   
    print(f"{fore}<-{content}->{rear}")
   
    index += r.span()+1https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif
页: [1]
查看完整版本: 正则表达式循环遍历匹配并计数