If your block of text is a line:
text = 'Problem Category: Human Endeavors Problem Subcategory: Space ExplorationProblem Type: Failure to LaunchSoftware Version: 9.8.77.omni.3Problem Details: Issue with signal barrier chamber.'
Then
import re
names = ['Problem Category', 'Problem Subcategory', 'Problem Type', 'Software Version', 'Problem Details']
text = 'Problem Category: Human Endeavors Problem Subcategory: Space ExplorationProblem Type: Failure to LaunchSoftware Version: 9.8.77.omni.3Problem Details: Issue with signal barrier chamber.'
pat = r'({}):'.format('|'.join(names))
data = dict(zip(*[iter(re.split(pat, text, re.MULTILINE)[1:])]*2))
print(data)
gives dict
{'Problem Category': ' Human Endeavors ',
'Problem Details': ' Issue with signal barrier chamber.',
'Problem Subcategory': ' Space Exploration',
'Problem Type': ' Failure to Launch',
'Software Version': ' 9.8.77.omni.3'}
So you can assign
text = df_dict['NOTE_DETAILS'][0]
...
df_dict['NOTE_DETAILS'][0] = data
and then you can access the sub-categories with index indexing:
df_dict['NOTE_DETAILS'][0]['Problem_Category']
. dicts/DataFrames dicts
. Zen of Python , Flat .