0

まとめるスクリプトで引数を管理しやすくしようとしています。関連する項目を辞書にまとめて、辞書を関数から渡すことにしました。必要に応じてオブジェクトを引き出します。

これらの項目の1つは正規表現です。私はそれを機能させるために物事を適切に構造化する方法を見つけるのに苦労しています。

私の最初のコード(辞書なし)。私は正規表現をパーサーに「ハード」コーディングしています:

def TopnTail(self,line):
    topRegEx = re.compile(r'(<!--make_database header end-->)') 
    tailRegEx = re.compile(r'(<!--make_database footer start-->)') 
    searchdumpTopOfPage = topRegEx.search(line)
    searchdumpBottomOfPage = tailRegEx.search(line)
    if searchdumpTopOfPage:
        self.__useLine=1
    if searchdumpBottomOfPage:
        self.__useLine=0  
    if self.__useLine == 1:
        self.trimmedLines = self.trimmedLines + line + "\n"
    return (self.trimmedLines)

'dictionaried'バージョンでは、セッターに変数を設定したいと思います。

def siteDetails():
    baseDict = {'topRegex':'''re.compile(r'(<!--make_database header end-->)')''', 'tailRegex':'''re.compile(r'(<!--make_database footer start-->)')'''}
    return baseDict

コンパイルされた正規表現にアクセスします。

def TopnTail(self,line):
    topRegEx = baseDict['topRegex'] 
    tailRegEx = baseDict['tailRegex'] 
    searchdumpTopOfPage = topRegEx.search(line)
    searchdumpBottomOfPage = tailRegEx.search(line)
    if searchdumpTopOfPage:
        self.__useLine=1
    if searchdumpBottomOfPage:
        self.__useLine=0  
    if self.__useLine == 1:
        self.trimmedLines = self.trimmedLines + line + "\n"
    return (self.trimmedLines) 

しかし、これはエラーをスローします:

line 35, in TopnTail
searchdumpTopOfPage = topRegEx.search(line)
AttributeError: 'str' object has no attribute 'search'

私が推測していることは、それが実際には正規表現オブジェクトを作成していないが、それでも文字列を渡していることを意味します。

私はおそらくここで3つの基本的なルールを破っていることに感謝します...しかしそれを機能させる方法についての提案は素晴らしいでしょう...(また、クラスと辞書の両方で初めて遊ぶ...だから私が本当にめちゃくちゃになりました!)

4

1 に答える 1

1

これはどう?

baseDict = {
  'topRegex': r'(<!--make_database header end-->)'
}

そしてあなたのTopnTail方法で

topRegEx = re.compile(baseDict['topRegex'])

あなたが持っているものの問題は、を含むtopRegExに文字列'''re.compile(r'(<!--make_database header end-->)')'''を割り当てていることです。strメソッドがないためsearch、エラーが発生します。

正規表現をコンパイルし、返されたオブジェクトを使用することは理にかなっています。正規表現の内容をdictに分割すると、正規表現のパターンを変更する必要がある場合や、動的に定義する場合に役立ちます。

于 2012-11-03T04:03:24.070 に答える