2016-12-28 6 views
1

これは私の2番目の質問ですが、私はこのサイトをたくさん読んでいます。とにかく、私はPythonの行と一致する正規表現を取得するのに問題があります。私がやっていることは、SVNからログを取得し、それをsvn_logに保存することです。私はその後、行ごとにログを読み込み、それを正規表現パターンと照合しようとするforループに入りますが、常に一致するものは返されません。ここで私が実行しているforループです:問題がRegexを行と一致させるにはPython

#Scan each line until the changed paths are located. 
pattern = re.compile(r"((M|A|D) /.+)") 
changed_paths = [] 
    for line in svn_log: 
     if pattern.match(line): 
      # Save the changed paths in a list. 
      changed_paths.append(line) 

を私のコメントが言及したように、私はSVNのログから変更されたパスを取得しようとしています。変更したいパスは、M、A、またはD文字で始まります。次に、このスクリプトをテストするために使用するログの例を示します。

r14 | autobuild | 2016-12-27 16:22:21 -0800 (Tue, 27 Dec 2016) | 2 lines 
Changed paths: 
    M /trunk/src/board/ozmo.c 
    M /trunk/src/ganymede/main.c 

私はこのログからそれぞれの行を解析し、それを印刷することがですが、私は最後の2行で私の正規表現パターンに一致しようとすると、私は試合を取得していない、と何も私のchanged_paths変数に追加されなかっます。私は、次のWebサイトを使って正規表現をテストしようとしました:http://www.pyregex.comそれは私のスクリプトにはありません。私の正規表現のパターンやループの中に何かが間違っていると私に知らせてください。ありがとう。

答えて

0

あなたはmatch instead of searchを使用しています。 matchのみ行の先頭に一致し、あなたがsearch必要か、文字を用いて以下に正規表現

line = ' M /trunk/src/board/ozmo.c' 
pattern = re.compile(r"((M|A|D) /.+)") 
pattern.search(line).group() 
# 'M /trunk/src/board/ozmo.c' 

# OR 

pattern = re.compile(r"\s*((M|A|D) /.+)") 
pattern.match(line).group() 

正規表現を簡素化することが可能に\s*を追加することができますが働い

pattern = re.compile(r"[MAD] (/.+)") 
pattern.search(line).groups()[0] 
# '/trunk/src/board/ozmo.c' 
+0

を設定しました! '\ s'を使うと、文字セットの前にあるすべての空白文字を含むことになると思いましたが、文字セットの前に空白文字をすべて含めるには' \ s * 'をインクルードする必要がありました。ありがとうございました! –

関連する問題