请教有关正则表达式的问题

来源:10-8 边界匹配符

慕运维2948618

2017-12-04

请问如何用正则表达式匹配字符'123456a123b1234c12345d123456e1234567f4321g'中长度为3到5的数字,只能是3到5,超过5的放弃匹配。

string = '123456a123b1234c12345d123456e1234567f4321g'
print(string)
r = re.findall('\d{3,}',string)
result = []
for i in r :
   result = result + re.findall('^\d{3,5}$',i)
print(r)
print(result)

运行结果:http://img.mukewang.com/szimg/5a24243900019d3805840060.jpg

这个是我实现的代码,先找出所有数字字符串,然后再找出长度为3到5的字符串,请问能不能直接用正则表达式实现呢?

写回答

4回答

慕斯卡8323326

2018-02-14

Hi,我根据老师回答以及你的问题,试了试发现这样可以

result = re.findall('(?<=\D)\d{3,5}(?!\d)', string)
print(result)

# 结果,为下面
['123', '1234', '12345', '4321']
1
1
谁把我的陈词滥调用了
(?
2019-02-16
共1条回复

7七月

2017-12-16

这个直接解决可能解决不了。但我想了想,可能可以通过下面的特性来解决,查了下资料:

非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分时很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。

   

(?=pattern)

   

非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

   

(?!pattern)

   

非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

   

(?<=pattern)

   

非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

   

(?<!pattern)

   

非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。这个地方不正确,有问题

此处用或任意一项都不能超过2位,如“(?<!95|98|NT|20)Windows正确,“(?<!95|980|NT|20)Windows 报错,若是单独使用则无限制,如(?<!2000)Windows 正确匹配

   


0
0

慕运维2948618

提问者

2017-12-10

import re
string = '123456a123b1234c12345d123456e1234567f4321g'
print(string)
r = re.findall('\d{3,}?',string)
print(r)

结果为:

//img.mukewang.com/szimg/5a2ce1720001fd3606370041.jpg

结果完全不符合。

0
0

7七月

2017-12-04

设置成非贪婪模式可以实现。

0
4
慕运维2948618
老师,可以看一下嘛。。
2017-12-16
共4条回复

Python3.8系统入门+进阶 (程序员必备第二语言)

语法精讲/配套练习+思考题/原生爬虫实战

14447 学习 · 4438 问题

查看课程