在数字之间提取文本 - Python

时间:2016-06-09 19:06:34

标签: python regex

(使用Python 2.7)

想象一个合同,除其他文本外,还包含由部分编号分隔的文本块。我试图提取每个部分的文本并将其放入一个新文档。因此,如果一份200页的合同有三十个部分由部分编号分隔,我想在一个新文件中使用这三十个部分。

我看了这个答案Extracting parts of text between specific delimiters from a large text file with custom delimiters and writing it to another file using Python,但它似乎没有做我想做的事。

我试图提取的一个例子是编号部分之间的文本(与编号部分相邻的部分标题将是一个很大的奖励),即:

1.2.3.4。一节

一些文字。其他一些文字也是如此。和东西。 下一行还有更多文字。

1.2.3.5。下一节

更多文字,逗号和内容。 甚至是新行和诸如此类的东西。

1.2.3.6。有些部分真的很棒

欢迎来到本节。哪个可能比其他人好。 我甚至无法解释它有多棒。

1.2.3.7。什么?一个新的部分?

对,这是一个新的部分!你不准备好吗? 如此多的新部分可用于您永远不会阅读的文本。

理想情况下,我会读取单个文件并输出单个文件。到目前为止,我已经尝试了以下代码的变体无济于事。我意识到这缺少了写入 - 输出部分(尚未到达):

{{1}}

2 个答案:

答案 0 :(得分:1)

这不会起作用吗?

import codecs
import re

# find anything that matches the header number pattern
regex = r'\d\.\d\.\d\.\d\.\s'

# read a contract in
with codecs.open("/Users/someuser/x/y/blah.txt", "r","utf-8") as ins:
    text = ins.read()

# perform magics, replace with empty string
output = re.sub(regex, '', text)

# output

答案 1 :(得分:1)

好的,所以如果我理解正确,你想捕捉部分编号之间的所有内容。

这是我提出的正则表达式字符串:regex = r'(?:\d\.){4}.(.+?)(?:\d\.){4}'

让我们稍微打破一下:

(?:\d\.){4}这是我们的4个数字,后跟一段时间。 (?:)使它成为非捕获组,因此我们可以查找此模式以将其计数4次,但不将其添加到我们的匹配中。

(.+?)这是我们想要捕捉的部分。如果在没有?:的情况下使用括号,它会生成一个捕获组,这就是我们匹配的内容。 .+?表示任何一个或多个角色,非贪婪。问号是非贪婪的部分,这意味着我们永远不会保持匹配的字符,当我们到达表达式的下一部分时,我们就会停止。

(?:\d\.){4} 我们再次以截面图案结束,因为我们想在两个部分之间进行捕捉

以下是我们用来获取我们想要的代码:

p = re.compile(regex, flags=re.DOTALL)

DOTALL标志允许我们保留换行符,通常.匹配除换行符之外的任何字符。

sections = p.findall(text)其中text是要搜索的字符串

findall方法返回我们匹配的捕获组列表。

['A section\n\nSome text. Some other text, too. And stuff. And even more text on the next line.\n\n', "Some sections are really great\n\nWelcome to this section. Which is probably better than others. And I can't even begin to explain how great it is.\n\n"]