如何用Python正则表达式实现两个推文列表的逆时间序合并?
问题:合并推文文件并按逆时间顺序输出
我尝试用Python结合正则表达式把两个存储推文的TXT文件内容合并成逆时间顺序的列表,目前只能用"+"拼接列表,不知道怎么实现merge_tweets()方法完成需求。
待合并的文件内容:
file 1
poptardsarefamous "Sometimes I wonder 2 == b or !(2 == b)" 2013 10 1 13:46:42 nohw4me "i have no idea what my cs prof is saying" 2013 10 1 12:07:14 pythondiva "My memory is great <3 64GB android" 2013 10 1 10:36:11 enigma "im so clever, my code is even unreadable to me!" 2013 10 1 09:27:00
file 2
ocd_programmer "140 character limit? so i cant write my variable names" 2013 10 1 13:18:01 caffeine4life "BBBBZZZZzzzzzZZZZZZZzzzZZzzZzzZzTTTTttt" 2011 10 2 02:53:47
现有代码:
import re import sys def read_tweets(file): records_list = [] with open(file, 'r') as f: for line in f: match = re.search(r'@(\w+) \"(.*)\" (\d+) (\d+) (\d+) (\d+:\d+:\d+)', line) if match: records_list.append({ 'tweeter': match.group(1), 'tweet': match.group(2), 'year': int(match.group(3)), 'month': int(match.group(4)), 'day': int(match.group(5)), 'time': match.group(6) }) return records_list def merge_tweets(list1, list2): return list1 + list2 def write_tweets(records_list, file): with open(file, 'w') as f: for record in records_list: f.write( f'@{{record[\"tweeter\"]}} \"{{record[\"tweet\"]}}\" {{record[\"year\"]}} {{record[\"month\"]}} {{record[\"day\"]}} {{record[\"time\"]}}\n') def main(): if len(sys.argv) != 4: print('Usage: python twitter_sort.py <file1> <file2> <output_file>') sys.exit(1) file1, file2, output_file = sys.argv[1], sys.argv[2], sys.argv[3] print('Reading files...') records_list1 = read_tweets(file1) records_list2 = read_tweets(file2) if len(records_list1) > len(records_list2): print(f'{file1} contained the most tweets with {len(records_list1)}.') elif len(records_list2) > len(records_list1): print(f'{file2} contained the most tweets with {len(records_list2)}.') else: print(f'{file1} and {file2} both contained {len(records_list1)} tweets.') print('\nMerging files...') records_list = merge_tweets(records_list1, records_list2) print('Files merged.') print('\nWriting file...') write_tweets(records_list, output_file) print('File written.')
请问如何实现merge_tweets()方法,将两个TXT文件按逆时间顺序合并?
解决方案
不需要用正则表达式处理排序——read_tweets()已经把时间信息解析成了结构化的整数(year、month、day)和字符串(time),直接基于这些字段排序即可。修改merge_tweets()方法如下:
def merge_tweets(list1, list2): # 先合并两个列表 combined = list1 + list2 # 按时间逆序排序:依次比较年份、月份、日期、时间 sorted_tweets = sorted( combined, key=lambda x: (x['year'], x['month'], x['day'], x['time']), reverse=True ) return sorted_tweets
说明:
- 排序的
key参数用lambda表达式,将每条推文的时间字段组合成元组,Python会自动按元组内元素依次比较大小。 reverse=True实现逆时间顺序,最新的推文排在最前面。- 最终排序后的推文顺序应为:
- poptardsarefamous(2013-10-1 13:46:42)
- ocd_programmer(2013-10-1 13:18:01)
- nohw4me(2013-10-1 12:07:14)
- pythondiva(2013-10-1 10:36:11)
- enigma(2013-10-1 09:27:00)
- caffeine4life(2011-10-2 02:53:47)
另外,原write_tweets()方法的f-string写法有误,需修正:
def write_tweets(records_list, file): with open(file, 'w') as f: for record in records_list: f.write( f'@{record["tweeter"]} "{record["tweet"]}" {record["year"]} {record["month"]} {record["day"]} {record["time"]}\n' )
修正原因:
原代码中{{record[\"tweeter\"]}}的写法会输出字符串{record["tweeter"]}而非变量值,去掉多余的大括号转义即可正常渲染变量。
内容的提问来源于stack exchange,提问作者tyrantGorilla
相关产品推荐
相关产品推荐

