7

次のような文字列に一致する正規表現があります。

--D2CBA65440D

--77094A27E09

--77094A27E

--770

--77094A27E09--

基本的に、これは 1 つ以上の改行または空白で囲まれた 16 進数の文字列に一致し、接尾辞として接頭辞 (ある場合とない場合があります) があります。

私は次の python コードを使用していますが、ほとんどの場合は正常に動作します。

hexaPattern = "\s--[0-9a-fA-F]+[--]?\s"
hex = re.search(hexaPattern, part)
if hex:
   print "found a match"

これは上記のすべてで機能しますが、このブロックの --77094A27E09 と一致しません。

<div id="arrow2" class="headerLinksImg" style="display:block

--77094A27E09

;">

ただし、次の同じ文字列に一致します。

<input type="checkbox" name="checkbox" id="checkboxKG3" class

--77094A27E09

Content-T="checkboxKG" value="KG3" />

私は何を間違っていますか?

4

4 に答える 4

11
import re
hexaPattern = re.compile(r'\s--([0-9a-fA-F]+)(?:--)?\s')
m = re.search(hexaPattern, part)
if m:
   print "found a match:", m.group(1)

これにより、高速化のためにパターンがプリコンパイルされます。これはr''(生の文字列) を使用するため、バックスラッシュは確実に正しく渡されます。これにより、括弧が追加されて「一致グループ」が作成されるため、一致後に16進文字列を抽出できます。また、2 番目の文字列の周りに「一致しないグループ」を追加し--ます。

2 番目の「--」を角括弧で囲んだため、「文字クラス」が得られました。[--]文字クラスが何に一致するか正確にはわかりません。'-'どんなキャラにも合うと思います。文字クラスでは、「-」は通常のように範囲に使用されます[a-z]が、範囲[--]は意味をなさないため、単に一致する a にフォールバックすると思います'-'。問題は、?後にそれがあるため、0 文字または 1'-'文字にしか一致せず、2 文字に一致させる必要があることです。

于 2012-04-22T17:54:08.990 に答える
4

これを試して: hexaPattern = r"^--[0-9a-fA-F]+(--)?\s"

私が挿入した修正は次のとおりです。

バックスラッシュが引用符によって「食べられる」ことがないように、先頭に r

^ 文字列の先頭に一致する先頭に

次に--、角括弧の代わりに括弧で囲みます(括弧は間違いのようです)

于 2012-04-22T17:49:28.833 に答える
0

他の人は、あなたの正規表現の問題を指摘しています。つまり、[--]基本的に、型にはまらない方法で単一のハイフンを見つけます...とにかく、あなたが望むものではありません。

\sまた、正規表現の先頭と末尾の両方にあると、特定の状況下で問題が発生するspacesこともお勧めしtabsますnewlines。そのため、前の一致の最後で改行が消費されたため、ファイルが--77094A27E09\n--D2CBA65440Dあり、2 番目が一致しない場合が発生する可能性があります。--D2CBA65440D\s

また、ファイル内の各行を個別にチェックしているようですが、実際に行う必要はありません。を使用re.findallして、すべてのマッチを一気に取得できます。

そして最後に、文字列の先頭は、先頭または末尾では--なく、実際のマーカーのようです。では、16 進数の周りのグループで\s使用してみませんか。必要なグループのみを返します。次に、これを行うことができます(htmlファイル全体を1つの文字列に読み取り、すべての一致を確認します):--([0-9a-fA-F]+)(?:--)?findall

text = """
<input type="checkbox" name="checkbox" id="checkboxKG3" class
--D2CBA65440D
<a>    --77094A27E09--  </a>
  hello world  --77094A27E
--770--
    --77094A27E09
Content-T="checkboxKG" value="KG3" />
"""
import re
hexapattern = r'--([0-9a-fA-F]+)(?:--)?'
print re.findall(hexapattern, text)
>>> ['D2CBA65440D', '77094A27E09', '77094A27E', '770', '77094A27E09']

私はあなたが望むものだと思います

于 2012-04-22T19:30:12.457 に答える
-2

私は以下を使用しました:

pattern = re.compile(r'(\n--)([0-9A-F]+)(--)?', re.I | re.S | re.M)

そしてそれはうまくいきました。すべての貢献に感謝します。

于 2012-04-25T21:27:42.147 に答える