0

次の例のように、pdf から抽出された目次である次の文字列を考えてみましょう。

A — N° 1 2 janvier 2013

TABLE OF CONTENT

Topic à one ......... 30 Second Topic .......... 33
Third - one ......... 3 Topic.with.dots .......... 33
One more line ......................... 27 last topic ...... 34

セクション名「Topic à one」、「Second Topic」、「Third -one」、「Topic.with.dots」、「One more line」、「last topic」を抽出したい

一致する正規表現に関する洞察はありますか?

4

5 に答える 5

2
# -*- coding: utf-8 -*-
string = "A — N° 1 2 janvier 2013

TABLE OF CONTENT

Topic à one ......... 30 Second Topic .......... 33
Third - one ......... 3 Topic.with.dots .......... 33
One more line ......................... 27 last topic ...... 34"
puts string.scan(/(\p{l}[\p{l} \.-]*)\s+\.+\s+\d+/i).flatten

これはあなたが望むことをします。1 文字のタイトルにも一致します。

于 2013-07-12T08:24:20.863 に答える
1

@sawa に似ています:

puts text.scan(/([a-zA-Z .]+?) \.\.++ \d+/).flatten.map(&:strip)
# >> Topic one
# >> Second Topic
# >> Third one
# >> Topic.with.dots
# >> One more line
# >> last topic

(私は彼のパターンの方が好きです。)

于 2013-07-12T08:51:00.257 に答える
1

次の(まだ最適化されていない)正規表現は、あなたの例で機能します:

(?i)(?=[A-Z])(?:\.[A-Z-]+|[A-Z -]+)+\b

ただし、たとえば、ASCII 以外の文字を一致させる必要がある場合や、使用されている正確な正規表現フレーバーに応じてパフォーマンスを最適化できる可能性がある場合など、改善が必要です。

regex101 で参照してください

Ruby 2の場合、私はお勧めします/(?=\p{L})(?:\.[\p{L}-]++|[\p{L} -]+)+\b/

于 2013-07-12T08:20:39.167 に答える