我有一个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帮助我。
答案 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
获取所有匹配项的列表。
请求进一步说明。