Python,关于正则表达式中findall()问题。自学Python,碰到这个例子想了好久

img


对一个IP地址的匹配字符串。
自己的想法是,[1-9]{1,3}匹配其中的'127',(.[0-9]{1,3}){3}匹配后面的‘.0.0.1’
但如果采用r'[1-9]{1,3}.[0-9].[0-9].[0-9]'就能匹配到‘127.0.0.1’
不知道为什么输出会多出一个‘.1‘
希望能得到解答

应该是这样进行匹配

import re
ip ='192.168.1.1'
trueIp =re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])',ip)
print(trueIp)

而findall这个函数

findall(string[, pos[, endpos]])

是在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
string : 待匹配的字符串。
pos : 可选参数,指定字符串的起始位置,默认为 0。
endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

>>> str1 = '127.0.0.1 192.168.1.1 256.256.0.0'
>>> pattern = re.compile(r"((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))")
>>> pattern.findall(str1)
['127.0.0.1', '192.168.1.1']
>>> 


127.0.0.1

正则应该这样写,连续数组\d+, 后面是有规律的.\d+......, 重复需要用分组,由于分组用(),所以要强调非捕获组?:,

所以完整正则为:

import re
regex = r"\d+(?:.\d+)+"
test_str = ("127.0.0.1\n"
"133.5.7.8")
regexp = re.compile(regex)
MT = regexp.findall(test_str)
print(MT)

------输出如下:

['127.0.0.1', '133.5.7.8']**