Python 使用regex module和.group()对匹配的值进行分组

Python 使用regex module和.group()对匹配的值进行分组,python,regex,Python,Regex,我的文本文件“reg1.txt”如下所示: import re import os f1=open("reg1.txt","r") for line in f1: rx=re.search("(\d{1,3}.){3}\d{1,3}",line) print(rx) f1.close() f2=open("reg1.txt","r") for line in f2: rx

我的文本文件“reg1.txt”如下所示:

import re
import os
f1=open("reg1.txt","r")
for line in f1:
    rx=re.search("(\d{1,3}.){3}\d{1,3}",line)
    print(rx)
f1.close()

f2=open("reg1.txt","r")
for line in f2:
    rx=re.search("(\d{1,3}.){3}\d{1,3}",line)
    if rx:
        print(rx.groups())
f2.close()
Python培训进展顺利,我们正在连接具有IP的服务器 192.168.101.124对于Python,我的电子邮件id是john1@xyz.com将此电子邮件用于官方用途。 Python服务器IP为101.201.17.155用于城市一校区Python服务器IP为101.201.101.5用于城市两校区我的朋友电子邮件id为peter1@xyz.com将此电子邮件用于官方用途。我的经理电子邮件id是cooldude@xyz.com将此电子邮件用于官方用途。PYTHON服务器IP为173.101.255.15,用于Citythree园区;测试服务器IP为95.101.175.101,用于Citythree园区

问题是要找到文件中的所有IP。 我的代码如下:

import re
import os
f1=open("reg1.txt","r")
for line in f1:
    rx=re.search("(\d{1,3}.){3}\d{1,3}",line)
    print(rx)
f1.close()

f2=open("reg1.txt","r")
for line in f2:
    rx=re.search("(\d{1,3}.){3}\d{1,3}",line)
    if rx:
        print(rx.groups())
f2.close()
我的控制台显示结果:

<re.Match object; span=(38, 53), match='192.168.101.124'>
None
<re.Match object; span=(34, 48), match='101.201.17.155'>
<re.Match object; span=(20, 33), match='101.201.101.5'>
None
None
<re.Match object; span=(24, 38), match='173.101.255.15'>
<re.Match object; span=(25, 39), match='95.101.175.101'>
('101.',)
('17.',)
('101.',)
('255.',)
('175.',)

没有一个
没有一个
没有一个
('101.',)
('17.',)
('101.',)
('255.',)
('175.',)
当匹配显示ip地址的完整范围时,为什么代码只打印匹配对象的第三部分

如何打印整个IP地址?

使用
打印(rx.group())
而不是
打印(rx.group())

groups(默认值=None)返回一个包含匹配的所有子组的元组, 从1到模式中的多个组

但是在您的例子中,您只捕获了1个组,即
(\d{1,3})。

使用
打印(rx.group())
代替
打印(rx.group())

groups(默认值=None)返回一个包含匹配的所有子组的元组, 从1到模式中的多个组

但是在您的例子中,您只捕获了1个组,即
(\d{1,3})。


您可以将文件读入一个变量,然后运行对
re.findall
的单个调用:

import re

rx = r"(?<!\d)(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(?!\d)"
with open("reg1.txt","r") as f1:
    contents = f1.read()            # Read the file into contents variable
    print(re.findall(rx, contents)) # Extract all IPs
重新导入

rx=r“(?您可以将文件读入一个变量,然后运行一个调用
re.findall

import re

rx = r"(?<!\d)(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}(?!\d)"
with open("reg1.txt","r") as f1:
    contents = f1.read()            # Read the file into contents variable
    print(re.findall(rx, contents)) # Extract all IPs
重新导入

rx=r“(?尝试将第一个字符设置为不匹配的组,并使用原始字符串而不是常规字符串。为了安全起见(实际上,它将匹配任何字符,而不仅仅是点):
r'(?:\d{1,3}\){3}\d{1,3}“
匹配任何字符。您需要将其转义以匹配文字
检查尝试将第一个字符设置为不匹配的组,并使用原始字符串而不是常规字符串。为了安全起见,可能会转义点(因为它将匹配任何字符,而不仅仅是点):
r'(?:\d{1,3}\){3}\d{1,3}“
匹配任何字符。您需要将其转义以匹配文本
检查这是否有用!我特别关心组()的问题。谢谢!@SUDIPTASAMAL没有问题。
re.search
只获取第一个匹配项,您需要多个匹配项,可以使用
re.findall
re.finditer
.groups
仅获取从匹配数据对象捕获的子字符串。我使用了“全部查找”。我正在玩“搜索”这就上升了。所以我发布了它。Findall有更大的范围和更多的功能。谢谢你的支持input@SUDIPTASAMAL这很有帮助!我特别关心小组的问题()。谢谢!@SUDIPTASAMAL没有问题。
re.search
只获取第一个匹配项,您需要多个匹配项,可以使用
re.findall
re.finditer
.groups
仅获取从匹配数据对象捕获的子字符串。我使用了“全部查找”。我正在玩“搜索”这就上升了。所以我发布了它。Findall有更大的范围和更多的功能。谢谢你的支持input@SUDIPTASAMALA.
groups
返回包含匹配的所有子组的元组,从1到模式中的组数。
groups
返回包含匹配的所有子组的元组,从1到howe许多团体都在这种模式中。