AttributeError:'NoneType'对象没有属性'group'

时间:2016-03-07 20:17:39

标签: regex python-3.x

我正在尝试打印三个变量,但我得到了一个AttributeError

"1 -3 JANE STREET "
"217- 219 EASTERN PARKWAY "
"219 -223 78TH STREET "
"28-31 34TH ST "

行['地址']的示例数据(上图)

import csv
import re
with open('/Users/d/Desktop/bldg_zip_codes.csv', 'r+') as f:
    reader = csv.DictReader(f)
    for index, row in enumerate(reader):
        if row['address'] != None:
          addy1 = re.search(r'\d\d-\d\d', row['address'])
          addy2 = re.search(r'-\s\d\d', row['address'])
          addy3 = re.search(r'\d\s-\d', row['address'])
          print(addy1.group(), addy2.group(), addy3.group())

 Traceback (most recent call last):
 File "excludenumsonst.py", line 46, in <module>
 print(addy1.group(), addy2.group(), addy3.group())
 AttributeError: 'NoneType' object has no attribute 'group'

如果我已经在第6行排除了NoneType,为什么会出现此错误?

如何解决此问题?

2 个答案:

答案 0 :(得分:3)

&#39; NoneType&#39;如果正则表达式未在提供的输入字符串中匹配任何内容,则对象没有属性&#39; ,因为匹配对象为None,未初始化,.group()为None。< / p>

\d\d-\d\d模式仅匹配28-31中的28-31 34TH ST-\s\d\d仅匹配- 21中的217- 219 EASTERN PARKWAY\d\s-\d }将匹配1 -39 -2中的1 -3 JANE STREET219 -223 78TH STREET

要使用连字符匹配初始数字,您可以使用

^\d+\s*-\s*\d+

请参阅regex demo

在代码中,您可以使用re.match在字符串的开头匹配,而不是将^re.search一起使用:

if row['address']:                                    # Check if address is present
    add = re.match(r'\d+\s*-\s*\d+', row['address'])  # Run the regex
    if add:                                           # Regex matched?
        print(add.group())                            # Print the match value

答案 1 :(得分:0)

您没有排除None,因为它是从re.search生成的。您的正则表达式与您需要提取的内容不匹配。第一个正则表达式匹配连续的2个数字,后跟连字符,然后是另外2个数字,例如"28-31"。第二个正则表达式匹配连字符后跟空格,然后是2位数,例如:"- 21"。最后一个匹配一个数字后跟一个空格,然后是一个连字符,然后是另一个数字,例如:"1 -3"

你必须检查那些正则表达式,使它们符合你的需要。