Python:使用.search方法提取出现不止一次的2个单词之间的所有内容

时间:2013-04-14 08:02:00

标签: python regex extract attributeerror

我有一个VHDL文件,其中包含我要提取的一些段落。 通常,它看起来像这样:

Declaration 1.
Some codes.
(Following are paragraphs I want to extract)
case (state) is
    case body 1
end case;

Declaration 2.
Some codes.
(Following are paragraphs I want to extract)
case (state) is
    case body 2
end case;

所以“箱体1”和“箱体2”就是我想要的。 “案件(州)是”和“案件结束;”可以匹配或不匹配,没关系。 我尝试了一些方法,如:

f1=open('/home/liuduo/Desktop/f2.vhd')
data=f1.read()
pattern=re.compile('case (state) is[\s\S]*?end case;')
reg=pattern.search(data).group()

pattern=re.compile('(?<=\bcase\b).*?(?=\bend\b)')
reg=pattern.search(data).group() 

pattern=re.compile('.*?case(.*?)end.*?')
reg=pattern.search(data).group() 

以及Stackflow中许多示例的帮助下的许多其他方法(谢天谢地!)。但似乎没有任何效果。

我得到的错误是“AttributeError:'NoneType'对象没有属性'group'”,表示没有匹配的内容。  我对Python很新(3天......)并且在JAVA中背景很弱所以REexp让我很困惑。我想知道是否有人可以帮我解决这个问题?

非常感谢你!

P.S。如果之前有人问这个问题,我很抱歉这个问题,在Stackflow上寻找答案后的第一个问题。 PLZ帮助我。

1 个答案:

答案 0 :(得分:1)

尝试

pattern=re.compile(r'case \S+ is\s*(.*?)\s*end case', re.DOTALL)
matches=pattern.findall(data)

print(matches)
# ['case body 1', 'case body 2']

您的第一个正则表达式失败,因为()是正则表达式中的特殊字符,需要进行转义才能与字面匹配。

您的第二个和第三个正则表达式失败,因为默认情况下.与换行符不匹配。

search方法仅返回第一个匹配项,因此我使用findall获取所有匹配项的列表。

请求进一步说明。