请教有关正则表达式的问题
来源: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)
运行结果:
这个是我实现的代码,先找出所有数字字符串,然后再找出长度为3到5的字符串,请问能不能直接用正则表达式实现呢?
4回答
-
慕斯卡8323326
2018-02-14
Hi,我根据老师回答以及你的问题,试了试发现这样可以
result = re.findall('(?<=\D)\d{3,5}(?!\d)', string) print(result) # 结果,为下面 ['123', '1234', '12345', '4321']
117七月
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 正确匹配
00慕运维2948618
提问者
2017-12-10
import re string = '123456a123b1234c12345d123456e1234567f4321g' print(string) r = re.findall('\d{3,}?',string) print(r)
结果为:
结果完全不符合。
007七月
2017-12-04
设置成非贪婪模式可以实现。
042017-12-16相似问题