我正在尝试使用正则表达式从文本文件中提取“条目”。除非该行以空格开头,否则该文件的每一行都是一个单独的条目,在这种情况下该行是前一行的延续。
示例:
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
应该匹配所有条目?
答案 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");
答案 4 :(得分:-1)
我认为想通了。
诀窍是“.
(与换行符不匹配)或换行后跟空格”。
PATTERN = re.compile(r"(?:.|\n\s)+")