我需要根据标题提取文本,例如在下面的代码中,我需要显示“体验”字段。就像,假设我有一个文本文件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
答案 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:', '']]
我希望这会有所帮助。