【问题标题】:How to split punctuation from words in python? [duplicate]如何从python中的单词中分离标点符号? [复制]
【发布时间】:2020-03-11 01:14:30
【问题描述】:

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

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

  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")

【问题讨论】:

  • 为什么不想使用 Python 内置函数?
  • .isupper().islower() 无论如何都是内置函数。
  • 当我说内置函数时,我指的是任何需要导入的函数(例如字符串),因为我正在使用的练习簿指示我们只使用 split()、strip()、replace () 等。抱歉,我认为我最初的问题并不明确 - 我会相应地对其进行修改。
  • Third answer here 提供了一种仅使用拆分和替换(即不导入)来分离单词的方法。

标签: python string spell-checking


【解决方案1】:

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

>>> 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']

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

【讨论】:

  • 但是有没有办法在没有正则表达式的情况下做到这一点?
  • 理论上,当然。您可以编写自己的代码,该代码基本上可以执行此正则表达式的功能;扫描连续字符,并在每次下一个连续字符属于不同字符类时产生一个子字符串。 (这三个字符类是单词字符和撇号、空白字符以及其他所有字符。)不过,我认为在这里避免正则表达式甚至没有太大的教育价值,因为如果你想学习如何进行字符串操作,那么你真的应该学习如何使用正则表达式。
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多