-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;

というわけで「ケース本体1」と「ケース本体2」が欲しいです。「case (state) is」および「end case;」一致するかどうかは関係ありません。私は次のようないくつかの方法を試しました:

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' object has no attribute '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が改行と一致しないため、2 番目と 3 番目の正規表現は失敗します。

このsearchメソッドは最初の一致のみを返すため、以前findallはすべての一致のリストを取得していました。

リクエストに応じてさらに説明します。

于 2013-04-14T08:32:16.780 に答える