def identify_and_tag_collaborations(line, collaborations_kb):
    """Given a line where Authors have been tagged, and all other tags
       and content has been replaced with underscores, go through and try
       to identify extra items of data which should be placed into 'h'
       subfields.
       Later on, these tagged pieces of information will be merged into
       the content of the most recently found author. This is separated
       from the author tagging procedure since separate tags can be used,
       which won't influence the reference splitting heuristics
       (used when looking at mulitple <AUTH> tags in a line).
    """
    for dummy_collab, re_collab in collaborations_kb.iteritems():
        matches = re_collab.finditer(strip_tags(line))

        for match in reversed(list(matches)):
            line = line[:match.start()] \
                + CFG_REFEXTRACT_MARKER_OPENING_COLLABORATION \
                + match.group(1).strip(".,:;- [](){}") \
                + CFG_REFEXTRACT_MARKER_CLOSING_COLLABORATION \
                + line[match.end():]

    return line
Given a line where Authors have been tagged, and all other tags
       and content has been replaced with underscores, go through and try
       to identify extra items of data which should be placed into 'h'
       subfields.
       Later on, these tagged pieces of information will be merged into
       the content of the most recently found author. This is separated
       from the author tagging procedure since separate tags can be used,
       which won't influence the reference splitting heuristics
       (used when looking at mulitple <AUTH> tags in a line).