鱼C论坛

 找回密码
 立即注册
查看: 1681|回复: 13

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

[复制链接]
发表于 2020-7-21 21:52:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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


请问这种情况如何得到pattern出现了多少次?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[pointer:]
    count += 1
print('一共匹配了%d次'%count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-21 22:25:09 | 显示全部楼层


11000111111111,可以不用匹配过就不算,例如,11000111111111,11000111111111,这样也可以。那这样怎么得到呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-21 22:28:05 | 显示全部楼层
JoeJoy 发表于 2020-7-21 22:25
11000111111111,可以不用匹配过就不算,例如,11000111111111,11000111111111,这样也可以。那这样怎 ...

我写的就是匹配过的就不算了呀,因为每次都是从上次匹配到的末尾的下一个字符开始的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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

......

这种形式

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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()[0] + 1
    yuan = yuan[pointer:]
    count += 1
print('一共匹配了%d次'%count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-21 22:35:06 | 显示全部楼层
Twilight6 发表于 2020-7-21 22:32
第一次:11000111111111
第二次:11000111111111
第三次:11000111111111

是的,这种效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-21 22:37:04 | 显示全部楼层
Twilight6 发表于 2020-7-21 22:32
第一次:11000111111111
第二次:11000111111111
第三次:11000111111111


可是这个用在我刚才发的一个新的情况又不太行了
截屏2020-07-21 下午10.37.19.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-21 22:38:07 | 显示全部楼层
JoeJoy 发表于 2020-7-21 22:37
可是这个用在我刚才发的一个新的情况又不太行了

晚上我图片加载不出来,你发代码吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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

......

这种形式刚才试了试不太行,这个怎么搞呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-21 22:43:18 | 显示全部楼层
Twilight6 发表于 2020-7-21 22:38
晚上我图片加载不出来,你发代码吧

在五楼,那个情况,你可以看到么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-21 23:29:32 | 显示全部楼层


去休息了,暂时就帮你到这了哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-22 16:22:18 | 显示全部楼层
本帖最后由 nahongyan1997 于 2020-7-22 16:33 编辑

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

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


如果您对我的答案感到满意,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[index:])
    if r is None:
        break
        
    distance = r.span()[1]-r.span()[0]
    fore = string[:index+r.span()[0]]
    content = string[len(fore):len(fore)+distance]
    rear = string[len(fore)+len(content)+1:]
    
    print(f"{fore}<-{content}->{rear}")
    
    index += r.span()[0]+1

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表