2

私はこの正規表現を持っています: (?<=[.!?])\s[A-Z] 私はこのテキストでそれを実行します:

The engineering plant, weapon and electronic systems, galley, and multitudinous other
equipment required to transform the new hull into an operating and habitable warship are
installed and tested. The prospective commanding officer, ship's officers, the petty
officers, and seamen who will form the crew report for training and intensive
familiarization with their new ship.

それは以下を生成します:

he engineering plant, weapon and electronic systems, galley, and multitudinous other
equipment required to transform the new hull into an operating and habitable warship are
installed and tested.
he prospective commanding officer, ship's officers, the petty officers, and seamen who
will form the crew report for training and intensive familiarization with their new ship.

ご覧のとおり、文の最初の文字が削除されます。それはそれらが大文字になっているからではありません(私はそれをテストしました)。

文の最初の文字が削除されないように修正するにはどうすればよいですか?

(私はPython 3を使用しています)

re.split()を使用してから、配列を出力し、各値を改行で区切りました

4

2 に答える 2

2

正規表現は空白文字と大文字のASCII文字に一致しますが、その前にドット、感嘆符、または疑問符が付いている場合に限ります。

これを使用してテキストを分割すると、大文字は分割に使用される区切り文字の一部になるため、削除されます。

正規表現をに変更します

(?<=[.!?])\s(?=[A-Z])

手紙は試合の一部にはなりません。

ただし、次の2つの点に注意してください。

  1. これは、新しい文がASCII文字で始まる場合にのみ機能します。ほとんどの英語の文章では、おそらく大丈夫ですが、他の言語では確かにそうではありません。
  2. テキストに略語が含まれている場合は、誤って分割される可能性があります。Mr. SmithDr. Jonesは2つに分割されます。
于 2012-12-27T18:43:24.643 に答える
1

問題は正規表現にあり、奇妙なことに、句読点()に「非消費トークン」(つまり、ポジティブルックビハインド)を使用しましたが、各文(?<=[.!?])の最初の文字を検出しませんでした([A-Z])。

その結果、で使用する正規表現は、各一致の最初の大文字split()消費します。あなたはおそらくそれを消費しないことを意味しました(つまり、その間のスペースのみを消費します)。その場合、テキストを消費しないポジティブルックアヘッドを使用したいと思います。

(?<=[.!?])\s(?=[A-Z])

先読みと後読みは一般にアンカーであり、アンカーは入力からのテキストを消費しません。もちろん、最も一般的に使用されるアンカーは、^および$です。それらは入力テキストの位置にのみ一致します。これはあなたが望むものです。

後読みは、位置の前のテキストが指定された正規表現と一致する/一致しない必要がある位置と一致し、先読みは、位置の次のテキストが指定された正規表現と一致する/一致しない必要がある位置と一致します。一致したスペースの後に必要なのは、大文字が続く位置でした。したがって、大文字(being )と一致する正の先読み( (?=<re>)、は正規表現)を使用します。<re><re>[A-Z]

于 2012-12-27T18:44:37.327 に答える