-1

我有一个 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;

所以“case body 1”和“case body 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 真的让我很困惑。我想知道是否有人可以帮助我解决这个问题?

太感谢了!

PS如果之前有人问过这个问题,我真的很抱歉,这是在寻找答案数小时后关于 Stackflow 的第一个问题。PLZ帮帮我。

4

1 回答 1

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']

您的第一个正则表达式失败,因为正则表达式()中的特殊字符需要转义以匹配它们。

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

search方法只返回第一个匹配项,所以我用来findall获取所有匹配项的列表。

应要求提供进一步解释。

于 2013-04-14T08:32:16.780 回答