如何在python中将文本文件分段为段落?

如何在python中将文本文件分段为段落?,python,regex,Python,Regex,我有一个文本文件: 000140.psd 1) You've heard of slow food. nsubj(heard-3, You-1) aux(heard-3, 've-2) root(ROOT-0, heard-3) case(food-6, of-4) amod(food-6, slow-5) s1 nmod:of(heard-3, food-6) t1 2) This is slow denim. nsubj(denim-4, This-1) cop(denim-4,

我有一个文本文件:

000140.psd

1) You've heard of slow food. 

nsubj(heard-3, You-1)
aux(heard-3, 've-2)
root(ROOT-0, heard-3)
case(food-6, of-4)
amod(food-6, slow-5) s1
nmod:of(heard-3, food-6) t1

2) This is slow denim. 

nsubj(denim-4, This-1)
cop(denim-4, is-2)
amod(denim-4, slow-3) s1
root(ROOT-0, denim-4) t1
我想运行一个循环,查看每个段落中包含s1或s2、s3等的所有行。 我希望能够为每个段落创建两个列表。第一个列表将包含其中带有“s”的行,另一个列表将包含所有行。 这就是为什么我可以创建“规则”来确定哪些行应该标记为“t”,在本例中给出了t1,但我想在尚未标记的情况下确定t。 是否有一种方法可以为每个段落列出两个不同的列表,以便自动进行比较

我试过:

lexxe = open('000140.ant')
for line in lexxe:
    line = line.rstrip()
    if re.search('s[0-9]$', line):
        source.append(line)
print(source)

但这只给了我一个包含s+一个数字的所有行的列表

您需要先将文本拆分为段落,然后再进行处理:

将文件读入字符串:

lexxe = open('000140.ant').read()
然后使用正则表达式将其拆分为段落:

paragraphs = re.sub(r'(\n\d\))', r'|\1', lexxe).split('|')
这将在每一个新行上拆分,后跟一个数字和一个结束括号。我不得不做一个变通,使用|字符,这样段落的开头就不会被占用。如果在文本中的任何位置使用|,这将不起作用,但可以选择其他字符

然后,您可以使用列表理解按段落查找s行:

source = [[l.rstrip() for l in p.split('\n') if re.search(r's\d$', l.rstrip())] for p in paragraphs]
因此,您将以以下方式结束:

> paragraphs
['\n000140.psd\n', "\n1) You've heard of slow food. \n\nnsubj(heard-3, You-1)\naux(heard-3, 've-2)\nroot(ROOT-0, heard-3)\ncase(food-6, of-4)\namod(food-6, slow-5) s1\nnmod:of(heard-3, food-6) t1\n", '\n2) This is slow denim. \n\nnsubj(denim-4, This-1)\ncop(denim-4, is-2)\namod(denim-4, slow-3) s1\nroot(ROOT-0, denim-4) t1\n']
您可以使用以下工具将其拆分为行:

paragraph_lines = [p.split('\n') for p in paragraphs]
给你:

> paragraph_lines
[['', '000140.psd', ''], ['', "1) You've heard of slow food. ", '', 'nsubj(heard-3, You-1)', "aux(heard-3, 've-2)", 'root(ROOT-0, heard-3)', 'case(food-6, of-4)', 'amod(food-6, slow-5) s1', 'nmod:of(heard-3, food-6) t1', ''], ['', '2) This is slow denim. ', '', 'nsubj(denim-4, This-1)', 'cop(denim-4, is-2)', 'amod(denim-4, slow-3) s1', 'root(ROOT-0, denim-4) t1', '']]
资料来源为:


请记住,您将标题000140.psd作为一个段落,但您可以只做段落=段落[1:]来消除它

您能澄清一下您到底想要实现什么吗?您已经描述了一个包含所有行的列表,一个包含其中有s的行的列表已经是您的脚本所做的。你能进一步解释一下你想要的输出是什么吗?对不起,基本上,因为每一个s1对应于他们所在的段落,我想把其中带s的行与同一段落中的每一行进行比较。因此,我希望每个段落有两个列表,或者我可以用一种方法将这些行与s与同一段落中的其他行进行比较,而不会遇到代码查看其他段落中的s行的问题。对。你的段落定义是什么?是^\d \?从本文中,每个段落都由一个空行和一个数字表示。对不起,我不确定我是否理解,但该文件以000140.psd开头,然后是一个空格,这给了我根据某些条件进行筛选的麻烦
> source
[[], ['amod(food-6, slow-5) s1'], ['amod(denim-4, slow-3) s1']]