26

我有一个字符串,我想提取其中的一个子集。这是一个更大的 Python 脚本的一部分。

这是字符串:

import re

htmlString = '</dd><dt> Fine, thank you.&#160;</dt><dd> Molt bé, gràcies. (<i>mohl behh, GRAH-syuhs</i>)'

我想抽出“ Molt bé, gràcies. mohl behh, GRAH-syuhs ”。为此,我使用正则表达式re.search

SearchStr = '(\<\/dd\>\<dt\>)+ ([\w+\,\.\s]+)([\&\#\d\;]+)(\<\/dt\>\<dd\>)+ ([\w\,\s\w\s\w\?\!\.]+) (\(\<i\>)([\w\s\,\-]+)(\<\/i\>\))'

Result = re.search(SearchStr, htmlString)

print Result.groups()
AttributeError: 'NoneType' object has no attribute 'groups'

由于Result.groups()不起作用,我想做的提取(即Result.group(5)Result.group(7))也不起作用。但我不明白为什么我会收到这个错误?正则表达式在 TextWrangler 中有效,为什么在 Python 中无效?我是 Python 的初学者。

4

2 回答 2

53

你得到AttributeError是因为你在调用groupsNone它没有任何方法。

regex.search返回None意味着正则表达式无法从提供的字符串中找到与模式匹配的任何内容。

使用正则表达式时,最好检查是否匹配:

Result = re.search(SearchStr, htmlString)

if Result:
    print Result.groups()
于 2013-03-05T20:20:44.693 回答
13
import re

htmlString = '</dd><dt> Fine, thank you.&#160;</dt><dd> Molt bé, gràcies. (<i>mohl behh, GRAH-syuhs</i>)'

SearchStr = '(\<\/dd\>\<dt\>)+ ([\w+\,\.\s]+)([\&\#\d\;]+)(\<\/dt\>\<dd\>)+ ([\w\,\s\w\s\w\?\!\.]+) (\(\<i\>)([\w\s\,\-]+)(\<\/i\>\))'

Result = re.search(SearchStr.decode('utf-8'), htmlString.decode('utf-8'), re.I | re.U)

print Result.groups()

那样工作。该表达式包含非拉丁字符,因此通常会失败。您必须解码为 Unicode 并使用 re.U (Unicode) 标志。

我也是初学者,我自己也遇到过几次这个问题。

于 2013-07-12T12:08:50.513 回答