-1

ケースを無視して複数のグループをキャプチャしようとしましたが、しばらく進行しません。私がチェックしている文字列には複数の形式があります。たとえば、いくつかの形式があります

<A title="Test title Ch.42" href="http://www.google.com">Test title Ch.42  </a>
<A title="Test title Vol2. Ch.42" href="http://www.google.com">Test title Vol2. Ch.42  </a>
<A title="Test title Vol2.Ch.42" href="http://www.google.com">Test title Vol2.Ch.42  </a>
<A title="Test title \"with multiple quotes\" Ch.42" href="http://www.google.com">Test title "with multiple quotes" Ch.42  </a>
<A title="Test title w1th numb3rs Ch.42" href="http://www.google.com">Test title w1th numb3rs Ch.42  </a>
<A title="Test title no 42" href="http://www.google.com">Test title no 42  </a>

したがって、一般的なルールは次のようになります。

  • タイトル タグのメイン タイトルには、数字や特殊文字を含むすべての文字を含めることができます

  • URL は標準の URL ですが、(.*) 式で問題なくキャプチャできます

  • Ch。一般的にはオプションです

  • 文字列に Vol. が含まれている場合、Ch. 必須になる

私の現在の正規表現は次のようになります。

pattern = re.compile('<A title="((.*)(?:Vol.[\d]+){0,1}(?: Ch.){0,1}([\d]+))" href="(.*)">')

試してキャプチャしたい:

  • 後ろの数字を含む Vol と Ch のタイトルタグ

  • Vol と Ch のないタイトル (および Vol と Ch の後ろの数字なし)

  • Chの後ろの数字。

正規表現を分割した方が良いでしょうか、パフォーマンスのために何が良いでしょうか (数千の文字列を実行しているので、パフォーマンスを維持したいと思います)?

よろしくバウムチェン

4

1 に答える 1

1

この場合、正規表現は解析に最適なツールではありません。まさにそのためのツールがあると思います。ただし、与えられた例では、これを試すことができます:

<a title="(.+?)\s?((Vol(\d+))?\s?\.?(Ch.(\d+)))?"\shref="(.+)">

デモ

  • group(1)- 題名、
  • group(2)- Vol と num または Ch と num、
  • group(3)- 番号付き巻
  • group(4)- 番号のみ (Vol)
  • group(5)- 番号付きのチャンネル
  • group(6)- 番号のみ (Ch.)
  • group(7)- URL
于 2015-08-13T09:19:28.623 に答える