-1

これがパターンです

pattern_strings = ['\\xc2d', '\\xa0', '\\xe7', '\\xc3\\ufffdd', '\\xc2\\xa0', '\\xc3\\xa7', '\\xa0\\xa0', '\\xc2', '\\xe9']
join_pattern =  '[' + '|'.join(pattern_strings) + ']'
pattern = re.compile(join_pattern)

これが機能です

def find_pattern(path):
    with open(path, 'r') as f:
        for line in f:
            # print line
            found = pattern.search(line)
            if found:
                print dir(found)
                logging.info('found in line - ' + line)
                logging.info('found - ' + str(found.group(0)))

これが入力です

\xc2d 
d\xa0 
\xe7 
\xc3\ufffdd 
\xc3\ufffdd 
\xc2\xa0 
\xc3\xa7 
\xa0\xa0 
'619d813\xa03697' 

これを実行すると、次のように出力されます

INFO:root:found in line - \xc2d 

INFO:root:found - d
INFO:root:found in line - d\xa0 

INFO:root:found - d
INFO:root:found in line - \xc3\ufffdd 

INFO:root:found - u
INFO:root:found in line - \xc3\ufffdd 

INFO:root:found - u
INFO:root:found in line - '619d813\xa03697' 

INFO:root:found - d

質問 -なぜそれはパターン全体を次のように伝えないの\xc2dですか?私はここで何か間違ったことをしていますか?-のようにパターンを一致させるために私がしなければならないことは何\xc2dですかd

アップデート

に追いかけることは何にjoin_pattern = '(' + '|'.join(pattern_strings) + ')'も一致しません

更新1

pattern_strings = ['\\xc2d', '\\xa0', '\\xe7', '\\xc3\\ufffdd', '\\xc2\\xa0', '\\xc3\\xa7', '\\xa0\\xa0', '\\xc2', '\\xe9']

join_pattern =   '|'.join(pattern_strings)
pattern = re.compile(join_pattern)

これは入力の何にも一致しません:(

4

2 に答える 2

1

中括弧reセットを示します

join_pattern = '[' + '|'.join(pattern_strings) + ']'正規表現を「の文字セットのいずれか1つ」と一致させ{ \ x c 2 d a 0 e 7 3 u f 9 | }ます。これはおそらくあなたが望む振る舞いではありません。使用する式には、次のものを使用します。

join_pattern = '|'.join(pattern_strings)

キャプチャ/非キャプチャグループを指定しようとしている場合を除き、括弧は必要ありません。

于 2012-07-27T19:46:54.153 に答える
0

問題は、正規表現を角かっこで囲んでいること[]です。これらは文字のセットを示します。つまり、、、、、、、、、またはのいずれかに[abc|def]一致します。あなたが持っている正規表現では、括弧は必要ありません。これがより大きな式の一部である場合は、丸括弧を使用してグループを示すことができます。これにより、正規表現のセクションがグループ化されます。(これはキャプチャグループでもあるため、そのコンテンツにはでアクセスできます。)abc|def().group(1)

于 2012-07-27T19:43:51.870 に答える