3

YYYYYYYYXXXXXXXXZZZZZZZZ 形式の文字列が多数あります。ここで、X、Y、および Z は固定長の 8 桁の数値です。ここでの問題は、整数の中間シーケンスを解析し、先頭のゼロを削除する必要があることです。残念ながら、3 つのシーケンスのそれぞれが開始/終了する場所を特定する唯一の方法は、桁数を数えることです。

私は現在、次の2つのステップでそれを行っています。

m = re.match(
    r"(?P<first_sequence>\d{8})"
    r"(?P<second_sequence>\d{8})"
    r"(?P<third_sequence>\d{8})",
    string)
second_secquence = m.group(2)
second_secquence.lstrip(0)

これは機能し、正しい結果が得られます。たとえば、次のようになります。

112233441234567855667788 --> 12345678
112233440012345655667788 --> 123456
112233001234567855667788 --> 12345678
112233000012345655667788 --> 123456

しかし、より良い方法はありますか?先頭のゼロを除いて、2 番目のシーケンスと一致する単一の正規表現を作成することは可能ですか?

私は次のことを行う正規表現を探していると思います:

  1. 最初の 8 桁をスキップします。
  2. 先行ゼロをスキップします。
  3. その後、後ろに 16 文字、前に 8 文字あるところまでキャプチャします。

前述のように、上記の解決策は機能するため、この問題の目的は、正規表現に関する私の知識を向上させることです。ポインタをいただければ幸いです。

4

4 に答える 4

4

これは「正規表現の無駄使い」の典型です。

文字列は固定長です。適切な位置でカットするだけです。

s = "112233440012345655667788"
int(s[8:16])
# -> 123456
于 2016-12-07T13:54:43.547 に答える
3

正規表現を使用しない方が簡単だと思います。

result = my_str[8:16].lstrip('0')
于 2016-12-07T13:53:48.627 に答える
2

正規表現は実際には必要ないという他の回答に同意してください。本当に正規表現を使用したい場合は、それ\d{8}0*(\d*)\d{8}を行う必要があります。

于 2016-12-07T13:58:42.650 に答える
1

正規表現で可能であることを示すために:

https://regex101.com/r/8RSxaH/2

# CODE AUTO GENERATED BY REGEX101.COM (SEE LINK ABOVE)
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(?<=\d{8})((?:0*)(\d{,8}))(?=\d{8})"

test_str = ("112233441234567855667788\n"
    "112233440012345655667788\n"
    "112233001234567855667788\n"
    "112233000012345655667788")

matches = re.finditer(regex, test_str)

for matchNum, match in enumerate(matches):
    matchNum = matchNum + 1

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

あなたが求めていることを実際に行う必要はありませんが、

于 2016-12-07T14:01:35.593 に答える