2

文字列で長さ6の英数字を見つけるための正規表現があります。文字列は次のようなものです。

PLT\n\nTRAVELLER NAME LIST\n\n     TRAVELLER              RECLOC COMPANY\n   1          TESTNUMBERFIVEQA/TESTN WL9795\n   2 TESTNUMBERONEYQWA/TEST RHFQCD\n   3 TESTNUMBERONEYQWAZZZ/T 1QZ1JF\n   4 TESTNUMBERONEYQWAZZZM/ N3BZW8\n   5 TESTNUMBERONEYQWAZZZMK 05RXPM\n   6 TESTNUMBERONEYQWAZZZMK 2XR9ZR\n   7 TESTNUMBERTHREEZZZ/TES 0Q14S4\n   8 TESTNUMBERTHREEZZZM/TE LRRKW3\n   9 TESTNUMBERTHREEZZZMK/T 949Z4T\n  10 TESTNUMBERTHREEZZZMKJ/ 51WFM2\n  11 TESTNUMBERTWOZZA/TESTN PRGWVT\n  12 TESTNUMBERTWOZZAZZZ/TE SM0BHS\n  13 TESTNUMBERTWOZZAZZZM/T QRJLH1\n  14 TESTNUMBERTWOZZAZZZMK/ R69NHV\n  15 TESTNUMBERTWOZZAZZZMKJ 67XKF7\n  16 TESTNUMBERTWOZZAZZZMKJ 68PV7P\n  17 TESTNUMBERTWOZZAZZZMKJ GCZZ0C\n)>  18 TESTNUMBERTWOZZAZZZMKJ MLMS3L\n  19 TESTNUMBERTWOZZAZZZMKJ 3R1S49\n  20 TESTNUMBERTWOZZAZZZMKJ WB700R\n  21 TESTNUMBERTWOZZAZZZMKJ 718KRC\n  22 TESTNUMBERTWOZZAZZZMKJ RTQH2H\n  23 TESTNUMBERTWOZZAZZZMKJ N2FLM6\n  24 TESTNUMBERTWOZZAZZZMKJ 40M1FR\n  25 TESTNUMBERTWOZZAZZZMKJ 71D3HF\n  26

そして、私が試した正規表現は次のようなものです:

for k in mainString:
    m = re.match('([0-9A-Z]{6})', k)
    if (m):
        do something

しかし、期待どおりに機能していません。誰かが私が大失敗をしている可能性があることを指摘できますか? 私が探しているパターンは、WL9795、RHFQCD などです。

ありがとう

4

2 に答える 2

5

このmatchメソッドは、文字列の先頭でのみ一致をチェックします。

search代わりにメソッドを使用してください。

また、()は不要です。

コード内で質問の先頭にある文字列が実際にある場合、ループはその文字列内のすべての個々の文字を反復処理するmainStringため、コードは正しく機能しません。for

代わりに使用できます

m = re.search(r'\b[0-9A-Z]{6}\b', mainString)
if (m):
    print(m.group())

正規表現の前に を指定すると、が文字列エスケープ シーケンスとして扱われない rことが保証されます。\b

単語の\b境界を意味し、6 文字の英数字の前後に単語文字がないことを確認します。それらがなければ、最初の一致は"TRAVEL"in になり"TRAVELLER"ます。

すべての一致のリストを取得したい場合は、代わりにfindallorを使用します。finditersearch

for m in re.finditer(r'\b[0-9A-Z]{6}\b', mainString):
    print(m.group())
于 2013-04-16T17:51:46.337 に答える
3

そこにいくつかの単語の境界が必要なようです:

>>> print re.findall(r'\b\w{6}\b',s)
['RECLOC', 'WL9795', 'RHFQCD', '1QZ1JF', 'N3BZW8', '05RXPM', '2XR9ZR', '0Q14S4', 'LRRKW3', '949Z4T', '51WFM2', 'PRGWVT', 'SM0BHS', 'QRJLH1', 'R69NHV', '67XKF7', '68PV7P', 'GCZZ0C', 'MLMS3L', '3R1S49', 'WB700R', '718KRC', 'RTQH2H', 'N2FLM6', '40M1FR', '71D3HF']

この正規表現は、正確に文字長の英数字パターンに一致します。つまり、何にも一致しませんが、から"foobarbaz"一致foobarします"foobar."

于 2013-04-16T17:56:57.880 に答える