(使用Python 2.7)
想象一份契约(Contract),除其他文本外,还包含由部分编号分隔的文本 block 。我正在尝试提取每个部分的文本并将其放入一个新文档中。因此,如果一份 200 页的契约(Contract)有 30 个部分,由部分编号分隔,我希望这 30 个部分位于一个新文档中。
我看了这个答案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。什么?新的部分?
没错,这是一个新部分!你还没有准备好吗? 如此多的新部分可用于您永远不会阅读的文本。
理想情况下,我将读取一个文件并输出一个文件。到目前为止,我已经尝试了以下代码的变体,但没有成功。我意识到这缺少写入输出部分(还没有到达那里):
import codecs
import re
regex = r'\D(?!\d)'
# read a contract in
with codecs.open("/Users/someuser/x/y/blah.txt", "r","utf-8") as ins:
text = ins.read()
# perform magics
output = re.findall(regex, text)
output
最佳答案
好吧,如果我理解正确的话,您想要捕获节号之间的所有内容。
这是我想出的正则表达式字符串: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 部分\n\n一些文本。还有其他一些文字。和东西。下一行还有更多文字。\n\n',“有些部分真的很棒\n\n欢迎来到本部分。这可能比其他部分更好。我什至无法开始解释它有多棒。\n\n"]
关于python - 提取数字之间的文本 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734262/