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

Python文件I/O练习:如何去除标点并提取每行最长单词?

解决提取每行最长单词时的标点问题

嘿,我太懂你现在的困扰了——好不容易搞定了找每行最长单词的功能,结果输出带着一堆标点,看着特别闹心!别慌,咱们有两种实用方法能解决这个问题,我给你掰扯清楚:

方法一:用string.punctuation清理单词两端标点

Python的string模块自带了所有常见标点符号,咱们可以用它精准去掉每个单词首尾的标点,同时保留单词中间可能存在的合法字符(比如连字符这类)。

修改后的代码如下:

import string

with open("original-3.txt", 'r') as file1:
    lines = file1.readlines()
    for line in lines:
        line = line.strip()  # 先把每行首尾的换行符、空格去掉
        if line:  # 跳过空行
            # 遍历每个单词,移除两端的标点
            cleaned_words = [word.strip(string.punctuation) for word in line.split()]
            # 找出长度最长的单词
            longest_word = max(cleaned_words, key=len)
            print(longest_word)

为啥这方法好用?

string.punctuation包含了所有标准标点:!"#$%&'()*+,-./:;<=>?@[\]^_{|}~`,`word.strip(string.punctuation)`会精准移除单词开头和结尾的这些符号,单词中间的字符(比如文本里的`frumious`)完全不受影响。

方法二:用正则表达式彻底清除非字母字符

如果你想把单词里所有非字母的字符(不管在开头、中间还是结尾)都删掉,正则表达式会更灵活。比如遇到snicker-snack这类词,会直接变成snickersnack,适合不需要保留连字符等特殊符号的场景。

代码示例:

import re

with open("original-3.txt", 'r') as file1:
    lines = file1.readlines()
    for line in lines:
        line = line.strip()
        if line:
            # 把每个单词里的非字母字符替换成空字符串
            cleaned_words = [re.sub(r'[^a-zA-Z]', '', word) for word in line.split()]
            longest_word = max(cleaned_words, key=len)
            print(longest_word)

正则表达式说明

re.sub(r'[^a-zA-Z]', '', word)的逻辑是:匹配所有不是大小写字母的字符([^a-zA-Z]是反向匹配规则),然后把这些字符替换成空,彻底清除所有标点和特殊符号。

测试你的文本

用你的original-3.txt测试的话,原来输出brillig,的行现在会输出brillig;包含Jabberwock,的行,会输出干净的Jabberwock,完全符合你的需求!

内容的提问来源于stack exchange,提问作者Burakhan Aksoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:27:33