3

私は正規表現を学んでおり、次のことをしようとしています:

以下は、一連の英数字の形式です。4 桁、2 つのスペース、8 桁、1 つのスペース、8 桁、1 つのスペース、8 桁、1 つのスペース、8 桁、1 つのスペース、OR バーで始まります。 .

FFFF  FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |

またはより明確に書かれています:

FFFF[space][space]FFFFFFFF[space]FFFFFFFF[space]FFFFFFFF[space]FFFFFFFF[space]|

最初に、00A3 で始まるファイル内の正しい行を見つける必要があります。次に、以下を使用して組み立てた数字グループを引き出す必要があります。

p = re.compile('00A3  ') # search for 00A3[space][space]
r = re.compile(???)      # search for desired 8 digit groups
q = re.compile(\[SECTION2\])

dataString = inFile.next() # 00A3 388A63FF 00000DF1 52984731 FF989ACB
while not q.match(dataString) # look for [SECTION2] line in file. This means we passed where 00A3 would have been so it must not be here.
    if p.match(dataString):
        numbers = r.findall(dataString) # numbers = [388A63FF, 00000DF1, 52984731, FF989ACB]
        break
    dataString = inFile.next() # get next line to check

これにより、さらに処理するための番号のリストが表示されます。スペースで区切られた8桁の英数字の4つのグループのみを見つける正規表現の書き方がわかりません。私の考えでは、8 桁の英数字と前にスペース、後ろにスペースを探すことでしたが、それは問題を引き起こし、どのように見えるでしょうか?

先読みオプションと後読みオプションを調べましたが、混乱します。

特に Python では、私はまだこれに非常に慣れていないので、より良い実装に関する提案をお待ちしています。

ありがとう!

4

4 に答える 4

1

実際にルックアラウンドを使用できます:

(?<=\d{4}\s{2})(\d{8}\s){4}(?=[\s|])
于 2013-07-23T17:54:40.640 に答える
1

findall を使用している場合は、

\w{8}

これは、8 桁の長さのすべての 16 進数に一致します。

于 2013-07-23T17:57:49.703 に答える
0

re: 異なる実装

all_numbers =[]
with open('input','r') as my_file:
    for line in my_file:
        line = line.split()
        if line[0] == "00A3":
            numbers = line[1:5]
            all_numbers.append(numbers)

numbers['388A63FF', '00000DF1', '52984731', 'FF989ACB']のように見えall_numbers、見つかった数字の単なるリストです。

于 2013-07-23T17:57:11.953 に答える