17

我正在尝试使用以下代码:

try:
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
except TypeError:
    clean = ""

但是我得到以下回溯......

Traceback (most recent call last):
  File "test.py", line 116, in <module>
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
AttributeError: 'NoneType' object has no attribute 'groups'

解决此问题的正确异常/正确方法是什么?

4

5 回答 5

29

re.matchNone如果找不到匹配项,则返回。可能对这个问题最干净的解决方案就是这样做:

# There is no need for the try/except anymore
match = re.match(r'^(\S+) (.*?) (\S+)$', full)
if match is not None:
    clean = filter(None, match.groups())
else:
    clean = ""

请注意,您也可以这样做if match:,但我个人喜欢这样做,if match is not None:因为它更清晰。记住“显式胜于隐式”。;)

于 2013-10-25T16:47:09.033 回答
18
Traceback (most recent call last):
  File "test.py", line 116, in <module>
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
AttributeError: 'NoneType' object has no attribute 'groups'

它告诉你要处理什么错误:AttributeError

的,它是:

try:
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
except AttributeError:
    clean = ""

或者

my_match = re.match(r'^(\S+) (.*?) (\S+)$', full)
my_match = ''
if my_match is not None:
     clean = my_match.groups()
于 2013-10-25T16:57:39.480 回答
5

试试这个:

clean = ""
regex =  re.match(r'^(\S+) (.*?) (\S+)$', full)
if regex:
    clean = filter(None, regex.groups())

问题是,如果找不到匹配项,则re.match(r'^(\S+) (.*?) (\S+)$', full)返回 a 。None因此错误。

try..except注意:如果您以这种方式处理它,则不需要 a 。

于 2013-10-25T16:46:56.773 回答
1

您需要添加AttributeError到您的例外条款。

except 子句可以将多个异常命名为带括号的元组:

try:
    clean = filter(None, re.match(r'^(\S+) (.*?) (\S+)$', full).groups())
except (TypeError, AttributeError):
    clean = ""
于 2017-10-19T10:00:06.623 回答
0

我认为使用 try, catch 处理 AttributeError 是一个更干净的解决方案。可能发生的情况是,对行执行的任何转换都可能是非常昂贵的操作。例如

match = re.match(r'^(\S+) (.*?) (\S+)$', full)

如果匹配不是无:clean = filter(None, match.groups()) else: clean = ""

在上述情况下,行的结构以正则表达式传递部分结果的方式发生了变化。所以,现在 match 不会是 none 并且会抛出 AttributeError 异常。

于 2015-11-19T03:01:18.997 回答