Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提取数字之间的文本-Python_Python_Regex - Fatal编程技术网

提取数字之间的文本-Python

提取数字之间的文本-Python,python,regex,Python,Regex,(使用Python 2.7) 想象一个合同,其中包含由章节号分隔的文本块。我试图提取每个部分的文本并将其放入一个新的文档中。所以,如果一份两百页的合同有三十个章节,由章节号分隔,我希望这三十个章节在一份新的文档中 我看了这个答案,但它似乎没有做我想做的事 我试图提取的一个示例是编号部分之间的文本(与编号部分相邻的部分标题将是一个巨大的优势),即: 1.2.3.4。一节 一些文本。还有其他一些文本。等等。 下一行还有更多的文字 1.2.3.5。下一节 更多的文字,加上逗号之类的东西。 甚至是新线什

(使用Python 2.7)

想象一个合同,其中包含由章节号分隔的文本块。我试图提取每个部分的文本并将其放入一个新的文档中。所以,如果一份两百页的合同有三十个章节,由章节号分隔,我希望这三十个章节在一份新的文档中

我看了这个答案,但它似乎没有做我想做的事

我试图提取的一个示例是编号部分之间的文本(与编号部分相邻的部分标题将是一个巨大的优势),即:

1.2.3.4。一节

一些文本。还有其他一些文本。等等。 下一行还有更多的文字

1.2.3.5。下一节

更多的文字,加上逗号之类的东西。 甚至是新线什么的

1.2.3.6。有些部分真的很棒

欢迎来到这个部分。这可能比其他的好。 我甚至无法解释它有多棒

1.2.3.7。什么?新部门

该死的,这是一个新的部分!你还没准备好吗? 如此多的新章节可用于你永远不会阅读的文本

理想情况下,我将读取单个文件并输出单个文件。到目前为止,我已经尝试了下面代码的变体,但没有效果。我意识到这缺少“写入到输出”部分(尚未实现):


这不管用吗

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

好的,如果我理解正确的话,您希望捕获节号之间的所有内容

下面是我找到的正则表达式字符串:
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\n一些文本。还有一些其他文本。以及其他内容。下一行还有更多的文本。\n\n',“有些部分非常好\n\n请来到这个部分。这可能比其他部分好。我甚至无法解释它有多好。\n\n”]

你不能逐行阅读文件吗,如果该行以
r(\d\)[4]
开头,则将该文本替换为空字符串,然后继续?@MauriceReeves,这样合同中就有很多其他文本没有被编号的部分括起来。想想租赁之类的东西……你有很多描述安排、当事人等的文字,但也有非常具体、编号的章节语言(我只想要后者)。我想如果我选择了你描述的替换选项,我最终会得到文档中的每一个文本,这不是我的目标。好吧,很公平,但是在你点击最后一个编号的部分后,你仍然会得到它后面的所有内容,不管怎样。对文档进行两次传递可能会更好。在您的案例中,您的解决方案似乎删除了最后一个部分:“1.2.3.7.什么?一个新的部分?该死,这是一个新的部分!您还没有准备好吗?这么多新的部分可以用于您永远不会阅读的文本。”似乎他只想要有部分标题的内容,他要他们脱光衣服。不幸的是,文档中并没有很好地定义哪些部分会有标题,哪些部分不会。哦,是的,我没有想到。我问他更多的细节,只是想看看我们是否能找到更好的解决方案,但还没有得到回复。您的解决方案非常接近,只要我们能够找出这一特定部分之后的下一部分内容。也许有一个干净的休息,然后通过一个小的修改你的解决方案将是完整的。也许如果部分结束时有2个换行符或类似的,我们可以在结尾处匹配,而不是下一个部分编号。这也是我想知道的。如果他需要更多的帮助或者想不出来,他会回来的-D
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