在python中将列表转换为小写并进行比较

时间:2018-03-21 13:53:54

标签: python python-3.x

我试图制作一个拼写检查器,它将在字典中读取(words.txt),然后在文本文件(text.txt)中读取。然后通过使用二进制搜索,它将比较2个文件,以便查看文本文件中拼写错误的单词。

我的麻烦在于将文本文件全部转换为小写,以便可以将其与已转换为小写的字典进行比较。

正则表达式就在那里,因为文本中的单词如long,和正则表达式会取出逗号。

我收到的错误消息是:

Traceback (most recent call last): File "C:\Users\S\Coursework\searchBinary.py", line 25, in <module> content = re.findall("[\w']+", content) File "C:\Users\S\AppData\Local\Programs\Python\Python36-32\lib\re.py", line 222, in findall return _compile(pattern, flags).findall(string) TypeError: expected string or bytes-like object

import re

def binS(lo,hi,target):

    if (lo>=hi):
        return False
    mid = (lo+hi) // 2
    piv = words[mid]
    if piv==target:
        return True
    if piv<target:
        return binS(mid+1,hi,target)
    return binS(lo,mid,target)



words = [s.strip("\n").lower() for s in open("words.txt")] 
words.sort() # sort the list

text = open("text.txt" , encoding="utf8")
content = text.read().split(" ")
content = [item.lower() for item in content]
content = re.findall("[\w']+", content)


for w in content:
    if not binS(0,len(words),w):
        print (w)

2 个答案:

答案 0 :(得分:1)

您需要一个字符串或类似字节的对象,但是您要传递一个列表。

如果您运行print(type(content)),您将获得

class'list'

尝试在运行正则表达式之前将文本重新组合为字符串,它应该可以正常工作。使用content = ' '.join(content)

import re

def binS(lo,hi,target):

    if (lo>=hi):
        return False
    mid = (lo+hi) // 2
    piv = words[mid]
    if piv==target:
        return True
    if piv<target:
        return binS(mid+1,hi,target)
    return binS(lo,mid,target)

words = [s.strip("\n").lower() for s in open("dictionary.txt")] 
words.sort() # sort the list

text = open("temp.txt" , encoding="utf8")
content = text.read().split(" ")
content = [item.lower() for item in content]
content = ' '.join(content)
content = re.findall("[\w']+", content)


for w in content:
    if not binS(0,len(words),w):
        print (w)

我有一个名为dictionary.txt的字典文件,我将“Hello worl my nae is Bob”放入temp.txt。

我的输出是:

  

世界

答案 1 :(得分:0)

错误显然是由于传递给re.findall函数的对象类型错误,正如已经指出的那样。我想建议你可以尝试一种不同的方法:避免完全使用正则表达式,并用这样的东西替换文本中的标点符号......

for ch in '.,:;?!"·$%&/+*#@<=>-_\\`|^´~()[]{}':
    text = text.replace(ch, " ")

...然后只需执行以下操作即可获得单词列表:

words = text.split()