Python Windows throws AttributeError: 'NoneType' object has no attribute 'group'
Python Windows throws AttributeError: 'NoneType' object has no attribute 'group'
这是我文件的头部样本:
1.1.1.0 - 1.1.1.255
2.2.2.0 - 2.2.2.255
3.3.3.0 - 3.3.3.100
这是我的 Python 正则表达式代码:
regex = r'(?P<start>\w+\.\w+\.\w+\.\w+) \- (?P<end>\w+\.\w+\.\w+\.\w+)'
with open('sorted_french_ips.txt', 'r') as file:
with open('sorted_french_edited_ips.txt', 'a') as sorted_french_edited_ips:
for line in file:
find = re.match(regex, line)
start = find.group('start')
end = find.group('end')
cidr = netaddr.iprange_to_cidrs(start, end)
cidr = str(cidr)
cidr = cidr.replace(', IPNetwork', '\n')
cidr = cidr.replace('[IPNetwork(\'', '')
cidr = cidr.replace('\')]', '')
cidr = cidr.replace('(\'', '')
cidr = cidr.replace('\')', '')
sorted_french_edited_ips.write(f'{cidr}\n')
当我在 Windows 中 运行 这段代码时,我得到这个错误:
Traceback (most recent call last):
File "C:\Users\Saeed\Desktop\python-projects\win.py", line 131, in <module>
write()
File "C:\Users\Saeed\Desktop\python-projects\win.py", line 81, in write
start = find.group('start')
AttributeError: 'NoneType' object has no attribute 'group'
但是如果我 运行 在 Linux 中使用相同的代码,它工作正常。
为什么我在 Windows 中出现错误? Window 的正则表达式和 Linux 有什么不同吗?是否应该更改?
您的输入文本文件是用字节顺序标记 BOM 编码的 Unicode。在Windows中打开Python文件时,默认使用系统编码,不同于Unicode,将BOM字节序列作为文本的一部分读入。
如果匹配出现在字符串的开头,re.match
function 只会找到匹配项。
第一个line
不是以您定义的模式开头,而是以BOM顺序开头。
要解决此问题,请确保您使用正确的编码读取文件。
如果您的文件是 UTF-8 BOM 编码,请使用
with open('sorted_french_ips.txt', 'r', encoding="utf-8-sig") as file:
在 Linux 中, 通常 ,默认编码是没有 BOM 的 UTF-8,因此它可以在不显式设置 encoding
参数的情况下工作。
这是我文件的头部样本:
1.1.1.0 - 1.1.1.255
2.2.2.0 - 2.2.2.255
3.3.3.0 - 3.3.3.100
这是我的 Python 正则表达式代码:
regex = r'(?P<start>\w+\.\w+\.\w+\.\w+) \- (?P<end>\w+\.\w+\.\w+\.\w+)'
with open('sorted_french_ips.txt', 'r') as file:
with open('sorted_french_edited_ips.txt', 'a') as sorted_french_edited_ips:
for line in file:
find = re.match(regex, line)
start = find.group('start')
end = find.group('end')
cidr = netaddr.iprange_to_cidrs(start, end)
cidr = str(cidr)
cidr = cidr.replace(', IPNetwork', '\n')
cidr = cidr.replace('[IPNetwork(\'', '')
cidr = cidr.replace('\')]', '')
cidr = cidr.replace('(\'', '')
cidr = cidr.replace('\')', '')
sorted_french_edited_ips.write(f'{cidr}\n')
当我在 Windows 中 运行 这段代码时,我得到这个错误:
Traceback (most recent call last):
File "C:\Users\Saeed\Desktop\python-projects\win.py", line 131, in <module>
write()
File "C:\Users\Saeed\Desktop\python-projects\win.py", line 81, in write
start = find.group('start')
AttributeError: 'NoneType' object has no attribute 'group'
但是如果我 运行 在 Linux 中使用相同的代码,它工作正常。
为什么我在 Windows 中出现错误? Window 的正则表达式和 Linux 有什么不同吗?是否应该更改?
您的输入文本文件是用字节顺序标记 BOM 编码的 Unicode。在Windows中打开Python文件时,默认使用系统编码,不同于Unicode,将BOM字节序列作为文本的一部分读入。
如果匹配出现在字符串的开头,re.match
function 只会找到匹配项。
第一个line
不是以您定义的模式开头,而是以BOM顺序开头。
要解决此问题,请确保您使用正确的编码读取文件。
如果您的文件是 UTF-8 BOM 编码,请使用
with open('sorted_french_ips.txt', 'r', encoding="utf-8-sig") as file:
在 Linux 中, 通常 ,默认编码是没有 BOM 的 UTF-8,因此它可以在不显式设置 encoding
参数的情况下工作。