68

あるディレクトリ内のファイルを調べて、特定の文字列を含むファイルを別のディレクトリにコピーする次のコードがありますが、文字列が大文字と小文字、または両方の混合である可能性があるため、正規表現を使用しようとしています。

正規表現を使用しようとする前に、機能するコードは次のとおりです

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

しかし、何かがうまくいかないようです。誰かが私を正しい方向に向けることができれば、それはありがたいです。

4

5 に答える 5

131
if re.match(regex, content):
  blah..

合わせ方によって使い分けることもできre.searchます。

于 2013-01-08T23:11:31.743 に答える
7

REPL を使用すると、API を簡単に学習できます。を実行pythonし、オブジェクトを作成してから、次のように要求しhelpます。

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

コマンドラインで、とりわけ次のように表示されます。

search(...)

search(string[, pos[, endpos]])--> オブジェクトまたはNone. 文字列をスキャンして一致を探し、対応する MatchObjectインスタンスを返します。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"

.は任意の文字に一致するaを持ち、任意の文字に一致するためre.compile("facebook.com").search("facebookkcom") is not Nonetrue です.。多分

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

は、特別な正規表現演算子として扱うのではなく\.、リテラル文字に一致します。".".

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

(?i)、正規表現を大文字と小文字を区別しないようre.IGNORECASEにしますが、自己完結型にします。

于 2013-01-08T23:09:23.417 に答える
2

最初に正規表現をコンパイルし、それを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
于 2013-01-08T23:08:16.100 に答える
1

正規表現は、実際にはこの方法で使用するべきではありません-あなたがやろうとしていることよりも複雑なものが必要でない限り-たとえば、コンテンツ文字列と比較文字列を次のように正規化することができます:

if 'facebook.com' in content.lower():
    shutil.copy(x, "C:/Users/David/Desktop/Test/MyFiles2")
于 2013-01-08T23:19:28.730 に答える