-1

正規表現を使用してテキストファイルから「エントリ」を抽出しようとしています。ファイルの各行は、行が空白で始まっていない限り、個別のエントリです。空白の場合、その行は前の行の続きです。

例:

import re

INPUT = """\
This is entry 1.
This
 is
  entry 2.
And this is entry 3.
This
 is
 entry
 4."""

OUTPUT = ["This is entry 1.",
          "This\n is\n  entry 2.",
          "And this is entry 3.",
          "This\n is\n entry\n 4."]

# What should the pattern be?
PATTERN = re.compile("(.+)(?=\n|$)")

assert PATTERN.findall(INPUT) == OUTPUT

PATTERNすべてのエントリを一致させるにはどうすればよいですか?

4

5 に答える 5

0
In [92]: re.findall(r'(.+(?:\n\s.*)*)\n?', INPUT)
Out[92]: 
['This is entry 1.',
 'This\n is\n  entry 2.',
 'And this is entry 3.',
 'This\n is\n entry\n 4.']

In [93]: OUTPUT == re.findall(r'(.+(?:\n\s.*)*)\n?', INPUT)
Out[93]: True
于 2012-11-26T19:39:06.503 に答える
0

Javaでテストした正規表現

^\S[.\s\w\r\n]*?(?=\n\S|\Z)
于 2012-11-26T19:51:22.650 に答える
0

文の最初の文字が大文字になっていることを信頼できる場合、これを実行するための良い方法は次の正規表現だと思います。

re.findall(r'\w[\w\s]+?\.', INPUT)

実際には、次の値を使用しますINPUT

>>> re.findall(r'\w[\w\s]+?\.', INPUT)
['This is entry 1.', 'This\n is\n  entry 2.', 'And this is entry 3.', 'This\n is\n entry\n 4.']

私が書いた正規表現には、各一致が前の空白ではなく文の先頭から始まるようにするために、の直前にあります\w[\w\s]+?

于 2012-11-26T19:56:08.787 に答える
0
OUTPUT = re.sub("[^\S\n]*\n[^\S\n]+", " ", INPUT).split("\n");

このデモを参照してください。

于 2012-11-26T20:44:37.217 に答える
-1

私はそれを理解したと思います。

秘訣は「.(改行と一致しない)または改行の後に空白が続く」です。

PATTERN = re.compile(r"(?:.|\n\s)+")
于 2012-11-26T19:35:56.323 に答える