如何从输入文件提取含单词与双词的多字段结构化输入?
解决Session条目多词电影名提取问题
你遇到的核心痛点很明确——Session条目的电影名可能是单词也可能是多词组合,常规按固定索引拆分的方法只能拿到单词,没法覆盖多词场景。这里给你几个实用的解决思路,核心逻辑都是“前三个字段固定,剩余所有内容合并为电影名”:
方法1:基于标识边界的逐段提取
如果你的输入是一个连续的字符串/令牌列表,可以先遍历所有内容,遇到Session标识时,先提取前三个固定字段,再收集后续内容直到碰到下一个命令标识(比如Cinema、Request这些),最后把收集到的内容拼接成完整电影名。
用Python举个实际处理的例子:
# 假设已经把输入内容按空格拆分成了令牌列表 tokens = ["Cinema", "1", "A", "15", "Cinema", "2", "X", "5", "Session", "1", "09:00", "Toy", "Story", "Session", "1", "14:30", "Ratatouille", "Session", "2", "09:00", "Up", "Request", "1", "1", "09:00", "10", ...] i = 0 while i < len(tokens): if tokens[i] == "Session": # 提取固定字段:影院编号、场次时间 cinema_id = tokens[i+1] session_time = tokens[i+2] # 收集后续所有内容,直到碰到下一个命令标识 movie_parts = [] j = i + 3 while j < len(tokens) and tokens[j] not in ["Cinema", "Request", "Change", "Cancel", "Print"]: movie_parts.append(tokens[j]) j += 1 # 拼接成完整电影名 movie_name = " ".join(movie_parts) print(f"场次信息:影院{cinema_id} {session_time} | 电影:{movie_name}") # 直接跳到下一个命令的起始位置 i = j else: # 处理其他类型条目,或者直接跳过 i += 1
这个方法能精准识别电影名的边界,不管电影名有多少个单词都能完整提取。
方法2:按条目分行的快速处理
如果你的输入是按条目分行存储的(比如每个Session/Request各占一行),处理起来会更简单:对每一行拆分后,直接取前三个元素之后的所有内容拼接成电影名。
示例代码:
input_lines = [ "Cinema 1 A 15", "Cinema 2 X 5", "Session 1 09:00 Toy Story", "Session 1 14:30 Ratatouille", "Session 2 09:00 Up", "Request 1 1 09:00 10", ... ] for line in input_lines: parts = line.split() if parts[0] == "Session": cinema_id = parts[1] session_time = parts[2] # 从第四个元素开始,所有内容都是电影名 movie_name = " ".join(parts[3:]) print(f"提取结果:{cinema_id}号影院 {session_time} - {movie_name}")
这种方式代码更简洁,适合输入格式规整、按条目分行的场景。
核心思路总结
本质上就是放弃“固定索引取最后一项”的思维,换成:
- 先定位Session条目的起始标识
- 提取前三个固定字段(Session、影院号、时间)
- 将剩余的所有内容合并为电影名,不管单词数量
这样就能同时适配单词(如Up)和多词(如Toy Story)的电影名了。
内容的提问来源于stack exchange,提问作者Utkarsh Atri
相关产品推荐
相关产品推荐

