2013-01-08 3 views
24

私は次のコードを1つのディレクトリにあり、特定の文字列を含むファイルを別のディレクトリにコピーしますが、文字列は大文字または小文字または両方の組み合わせである可能性があるため、正規表現を使用しようとしています。私はここでは正規表現のPython:if文でRegExを使用するには?

import os 
import re 
import shutil 

def test(): 
    os.chdir("C:/Users/David/Desktop/Test/MyFiles") 
    files = os.listdir(".") 
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2") 
    for x in (files): 
     inputFile = open((x), "r") 
     content = inputFile.read() 
     inputFile.close() 
     if ("Hello World" in content) 
      shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2") 

を使用しようとした前にここで

は、動作するコードである私はのラインが必要であることを推測正規表現の

import os 
import re 
import shutil 

def test2(): 
    os.chdir("C:/Users/David/Desktop/Test/MyFiles") 
    files = os.listdir(".") 
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2") 
    regex_txt = "facebook.com" 
    for x in (files): 
     inputFile = open((x), "r") 
     content = inputFile.read() 
     inputFile.close() 
     regex = re.compile(regex_txt, re.IGNORECASE) 

イムを使用しようとしたときに私のコードですコードのようなもの

if regex = re.compile(regex_txt, re.IGNORECASE) == True 

しかし、誰かができるなら、私は何もできないようです正しい方向に私に指摘していただければ幸いです。

+0

から始まり、あなたはこれが役立つかもしれません。 Python用の[正規表現HOWTO](http://docs.python.org/2/howto/regex.html) 2.7。 – detly

答えて

49
if re.match(regex, content) is not None: 
    blah.. 

どのように一致させるかによって、re.searchを使用することもできます。

+0

お返事ありがとうございます。正規表現が何も一致しない場合、 "None"を返します。 –

+0

そうです。 search()とmatch()関数の違いについては、http://docs.python.org/2/library/re.html#re.searchをご覧ください。 – aw4lly

+4

@ LWH91もしあなたが '.match()'を望むなら、あなたのコードはorginallyで 'in 'ではなく' .startswith() 'を使っていたはずです:) –

0

最初に正規表現をコンパイルしてから、matchfind、または他のいくつかの方法でそれを実際にいくつかの入力に対して実行する必要があります。

import os 
import re 
import shutil 

def test(): 
    os.chdir("C:/Users/David/Desktop/Test/MyFiles") 
    files = os.listdir(".") 
    os.mkdir("C:/Users/David/Desktop/Test/MyFiles2") 
    pattern = re.compile(regex_txt, re.IGNORECASE) 
    for x in (files): 
     with open((x), 'r') as input_file: 
      for line in input_file: 
       if pattern.search(line): 
        shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2") 
        break 
7

REPLを使用すると、APIの学習が容易になります。ただ、pythonを実行するオブジェクトを作成し、helpを求める:コマンドライン・ショーで

$ python 
>>> import re 
>>> help(re.compile(r'')) 

を、とりわけ:

search(...)

search(string[, pos[, endpos]]) - >マッチオブジェクトまたはNoneを。 文字列をスキャンして一致するものを探し、対応する MatchObjectインスタンスを返します。文字列のどの位置も一致しない場合は、Noneを返します。

あなたは.は、任意の文字に一致するのでとてもre.compile("facebook.com").search("facebookkcom") is not None真である。なお、

regex = re.compile(regex_txt, re.IGNORECASE) 

match = regex.search(content) # From your file reading code. 
if match is not None: 
    # use match 

regex_txt = "facebook.com" 

は任意の文字に一致 .を持って行うことができます。たぶん

regex_txt = r"(?i)facebook\.com" 

\.ではなく、特殊な正規表現演算子として.を治療するリテラル"."文字と一致します。

r"..."ビットは、正規表現コンパイラがそれを解釈するPythonパーサの代わりに\.のエスケープを取得することを意味します。

(?i)は、正規表現をre.IGNORECASEのように大文字と小文字を区別しないようにします。

1

正規表現のは本当にこの方法で使用すべきではない - あなたは何をしようとしてよりも複雑な何かしない限り - 例えばを、あなただけであるためにあなたのコンテンツを文字列と比較です文字列を正規化することができます:

if 'facebook.com' in content.lower(): 
    shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2") 
2

if re.(私はいつもここでつまずく)

if re.search(r'pattern', string):(私は通常このように終わる)

シンプルなIF-テスト:

if re.search(r'ing\b', "seeking and blundering"): 
    print("yes") 

パターンの確認、小文字を区別しないストリング、ケースを抽出します。

match_object = re.search(r'$OUGHT (.*) BE^', "ought to be", flags=re.IGNORECASE) 
if match_object: 
    assert "to" == match_object.group(1) 

注:

  • 使用re.search()がre.matchありません。文字列の一致restricts to the start、私に尋ねると混乱しやすいコンベンションです。あなたが望む場合でも、代わりにドルを使用してください。re.search(r'$...', ...)

  • raw string構文r'pattern'を最初のパラメータに使用してください。そうしないと、\bは正規表現でword-boundaryを意味special sequenceあり、この例ではre.search('ing\\b', ...)

  • のように、バックスラッシュを二重にする必要があります。バックスペースと混同しないでください。

  • re.search()は、何も見つからない場合はNoneを返します。これは常にfalsyです。

  • re.search()は、何かが見つかった場合はMatch objectを返します。これは常に真実です。

  • グループは、内部一致するものである

  • グループ番号を括弧今後の参考のために1

  • Specs

  • Tutorial

関連する問題