正则表达式匹配以空格开头的行延续?

时间:2012-11-26 19:31:36

标签: python regex

我正在尝试使用正则表达式从文本文件中提取“条目”。除非该行以空格开头,否则该文件的每一行都是一个单独的条目,在这种情况下该行是前一行的延续。

示例:

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应该匹配所有条目?

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

正则表达式我在Java中测试

^\S[.\s\w\r\n]*?(?=\n\S|\Z)

答案 2 :(得分: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]+?,以确保每个匹配从句子的开头开始,而不是之前的空格。

答案 3 :(得分:0)

OUTPUT = re.sub("[^\S\n]*\n[^\S\n]+", " ", INPUT).split("\n");

请参阅this demo

答案 4 :(得分:-1)

我认为想通了。

诀窍是“.(与换行符不匹配)或换行后跟空格”。

PATTERN = re.compile(r"(?:.|\n\s)+")