需要使用python根据其标题提取内容

时间:2019-07-17 06:57:35

标签: python python-3.x

我需要根据标题提取文本,例如在下面的代码中,我需要显示“体验”字段。就像,假设我有一个文本文件ab.text,其数据如下:

Name: xyz
Experience: 
123 company 2016-2017
567 company 2017-2018
yzx company 2018-2019

Skills:
Python, MachineLearning, Java.

现在,我需要阅读此文本文件,并仅显示“体验”字段下的文本。 注意:名称,经验和技能的顺序可能有所不同。 我是python新手,请为此提供帮助。

预期输出:

Experience: 
123 company 2016-2017
567 company 2017-2018
yzx company 2018-2019

3 个答案:

答案 0 :(得分:3)

您可以使用re模块并用其解析文本:

data = '''Name: xyz
Experience:
123 company 2016-2017
567 company 2017-2018
yzx company 2018-2019

Skills:
Python, MachineLearning, Java.'''

import re

#Step 1. Split the string
s = [g.strip() for g in re.split('^(\w+):', data, flags=re.M) if g.strip()]
# s = ['Name', 'xyz', 'Experience', '123 company 2016-2017\n567 company 2017-2018\nyzx company 2018-2019', 'Skills', 'Python, MachineLearning, Java.']

#Step 2. Convert the splitted string to dictionary
d = dict(zip(s[::2], s[1::2]))
# d = {'Name': 'xyz', 'Experience': '123 company 2016-2017\n567 company 2017-2018\nyzx company 2018-2019', 'Skills': 'Python, MachineLearning, Java.'}

print(d['Experience'])

打印:

123 company 2016-2017
567 company 2017-2018
yzx company 2018-2019

答案 1 :(得分:1)

这可以解决问题

代码

matches = re.findall('^Experience:.*[(\d+ \w+ \d+\-\d+)\n]+$', text, re.M)
for match in matches:
    print(match.strip())
    print()

说明

  

^经验

表示我们的匹配项应以单词Experience开头

  

[(\ d + \ w + \ d +-\ d +)\ n] +

将与模式123 company 2016-2017匹配一次或多次

  

$

末尾的

表示模式123 company 2016-2017用尽时模式结束一次

  

re.M

表示我们的输入文本是多行字符串,而不是单个长文本

答案 2 :(得分:0)

我认为您设置的问题定义得不是很好。但是根据您提供的示例文件,以下代码将起作用。您应该了解有关文件I / O,列表方法和列表理解的知识,以进一步了解下面的代码。我试图以一种方式来构造它,使您每次运行一行时都可以调查该行的功能,因此代码看起来并不像魔术。

f = open('C:/ab.text') # change ot the path of your file
contents = f.read() #read the contents
contents = contents.split('\n') # turn the read object into a list
contents = [x.strip() for x in contents] #remove whitespace from elements
# below we concatentate the list so it starts at the Experience: row
contents = contents[contents.index('Experience:'):] 
# make a list of all the lines containing colons ':'

colon_places = [i for i,x in enumerate(contents) if x.find(':')>0] 

#if there is only one colon it will be at the start from 'Experience:'
if colon_places == [0]:
    contents=  contents
#if there is more than one, we only want to go as far as the second
elif len(colon_places) > 1:
    contents = contents[0:colon_places[1]]

#finally, we throw out the header 'Experience' and any empty rows
Experience = [x for x in contents if x  not in ['Experience:', '']]

我希望这会有所帮助。