You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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实现逆时间顺序,最新的推文排在最前面。
  • 最终排序后的推文顺序应为:
    1. poptardsarefamous(2013-10-1 13:46:42)
    2. ocd_programmer(2013-10-1 13:18:01)
    3. nohw4me(2013-10-1 12:07:14)
    4. pythondiva(2013-10-1 10:36:11)
    5. enigma(2013-10-1 09:27:00)
    6. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:15:43