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
相关产品推荐
相关产品推荐

