首页 > 解决方案 > 如何从python中的单词中分离标点符号?

问题描述

我正在尝试创建一个拼写检查功能,该功能可以读取一个文本文件,其中包含一个包含几个拼写错误的单词的段落。例如:“我最喜欢的科目是:物理、数学、化学树和生物学——我发现课​​后使用 iPad 做综合笔记很有必要。” 我要解决三个问题:

  1. 目前,该程序认为 Maths 是一个不正确的词,因为该词后立即出现逗号。我相信为了解决这个问题,最好将文本文件中的字符串拆分成这样:['My', 'favorite', 'subjects', 'are', ':', ' ', '物理','','数学',','...等]。如何在不使用任何导入的 python 函数(例如字符串或正则表达式(重新)函数)的情况下将字符串拆分为单词和标点符号?

  2. 我目前正在通过迭代文本文件中的每个单词来将每个单词与接受的英语单词词典进行比较。是否有更好的方法来预处理列表以快速识别单词是否包含给定元素以提高程序的运行时间?

  3. 有几个单词,例如“eBook”和“iPad”,是is_valid_word下面函数中使用的规则的例外(即单词必须以大写开头,所有其他字母都小写或单词中的所有字符都必须大写) . 有没有办法可以检查字符串是否是有效单词?

任何帮助将不胜感激!

def get_words():
    with open( "english.txt" ) as a:
         words = a.readlines()
    words = [word.strip() for word in words]
    return words

isWord = get_words()

def is_valid_word(st):
    if isinstance(st, str):
        st_lower = st.lower()
        if st_lower in isWord:
            if (st[0:len(st)].isupper() or st[0:len(st)].islower()) or (st[0].isupper() and st[1:len(st)].islower()) or st[0:len(st)].isupper():
                return (True)
            else: 
                return(False)
        else:
            return (False)
    else:
        return (False)

def spell_check_file( file ):
    incorrectWords = []  # Will contain all incorrectly spelled words.
    num = 0  # Used for line counter.
    with open(file, 'r') as f:
        for line_no, line in enumerate(f):
            for word in line.split():
                if is_valid_word(word) == False:
                    incorrectWords.append(line_no)
                    incorrectWords.append(word)
        for f in incorrectWords:
            return incorrectWords
            print (incorrectWords)

spell_check_file("passage.txt")

标签: pythonstringspell-checking

解决方案


这种任务就是正则表达式的用途。在没有正则表达式的情况下尝试这样做是一种自我惩罚。

>>> import re
>>> pattern = re.compile(r"[\w']+|\s+|[^\w'\s]+")
>>> pattern.findall("My favorite subjects are: Physics, Maths, Chemistry")
['My', ' ', 'favorite', ' ', 'subjects', ' ', 'are', ':', ' ', 'Physics', ',',
 ' ', 'Maths', ',', ' ', 'Chemistry']

请注意,我已将'匹配单词的部分包含在内,因此“不要”之类的单词将保留在一个部分中。


推荐阅读