0

特定の場所の行で文字列を検索し、検索結果を出力する次のプログラムがあります。検索で大文字と小文字を区別せず、出力行で検索文字列を強調表示するかどうかを選択できるようにしたいと考えています。

import re, os, glob  
from colorama import init, Fore, Back, Style  
init(autoreset=True)

path = "c:\\temp2"  
os.chdir(path) 

def get_str(msg):
    myinput = input(msg)
    while True:
        if not bool(myinput):
            myinput = input('No Input..\nDo it again\n-->')
            continue
        else:
            return myinput

ext = get_str('Search the files with the following extension...')
find = get_str('Search string...')
case = get_str('    Ignore case of search string? (y/n)...')   
print()

if case == "y" or case == "Y":
    find = re.compile(find, re.I) 
else:
    find = find

files_to_search = glob.glob('*.' + ext)

for f in files_to_search:
    input_file = os.path.join(path, f)
    with open(input_file) as fi:
        file_list = fi.read().splitlines() 
        for line in file_list:
            if re.search(find, line):  
                line = re.sub(find, Fore.YELLOW + find + Fore.RESET, line)
                print(f, "--", line) 

ケースに「n」を選択すると、プログラムが機能します。「y」を選択すると、プログラムの実行時に次のエラーが発生します。

Search the files with the following extension...txt  
Search string...this  
    Ignore case of search string? (y/n)...y  

Traceback (most recent call last):  
  File "C:\7. apps\eclipse\1. workspace\learning\scratch\scratchy.py", line 36, in <module>
    line = re.sub(find, Fore.YELLOW + find + Fore.RESET, line)  
TypeError: Can't convert '_sre.SRE_Pattern' object to str implicitly   

「はい」の場合にこれを機能させるにはどうすればよいですか?

4

1 に答える 1

1

この問題は、呼び出しで行っている文字列の連結に関係していますre.sub。が文字列ではなく、コンパイルされた正規表現オブジェクトである場合、式Fore.YELLOW + find + Fore.RESETは無効です。find

これを修正するには、元の文字列に使用するものとは異なる変数名を正規表現パターンに使用することをお勧めします。

if case == "y" or case == "Y":
    pattern = re.compile(find, re.I)
else:
    pattern = find

pattern次に、最初の引数として に渡しますre.subfindすべての場合において文字列のままであるため、2 番目の引数の式で機能します。

line = re.sub(pattern, Fore.YELLOW + find + Fore.RESET, line)
于 2013-10-04T10:07:32.197 に答える