如何在特定的未知索引处对字符串输入进行切片

时间:2019-07-06 09:29:18

标签: python

给出一个字符串作为输入(例如“您叫什么名字?”)。输入始终包含一个我要提取的问题。但是我要解决的问题是输入总是带有不需要的输入。

因此输入可以为(但不限于)以下内容:

1- "eo000 ATATAT EG\n\nWhat is your name?\nkgda dasflkjasn" 2- "What is your\nlastname and email?\ndasf?lkjas" 3- "askjdmk.\nGiven your skills\nhow would you rate yourself?\nand your name? dasf?"

(请注意,在第三个输入处,问题以单词“ Given”开头,以“ yourself?”结尾)

以上输入示例是由pytesseract OCR库生成的,该库扫描图像并将其转换为文本

只想从垃圾输入中提取问题,而别无其他。

我尝试使用 re库 find('?',1)函数来获取问题的最后一部分的索引(假设现在第一个问号始终是问题的结尾,而不是我不希望输入的一部分)。但是我不知道如何获得问题首字母的索引。我试图反向循环并在输入中得到第一个点\ n,但是问题并不总是在第一个字母前有\ n。

def extractQuestion(input):
    index_end_q = input.find('?', 1)
    index_first_letter_of_q = 0 # TODO
    question = '\n ' . join(input[index_first_letter_of_q :index_end_q ])


2 个答案:

答案 0 :(得分:12)

查找问题的第一个单词索引的一种方法是搜索具有实际含义的第一个单词(您对我认为的英语单词感兴趣)。一种方法是使用pyenchant

#!/usr/bin/env python

import enchant

GLOSSARY = enchant.Dict("en_US")

def isWord(word):
    return True if GLOSSARY.check(word) else False

sentences = [
"eo000 ATATAT EG\n\nWhat is your name?\nkgda dasflkjasn",
"What is your\nlastname and email?\ndasf?lkjas",
"\nGiven your skills\nhow would you rate yourself?\nand your name? dasf?"]

for sentence in sentences:
    for i,w in enumerate(sentence.split()):
        if isWord(w):
            print('index: {} => {}'.format(i, w))
            break

上面的代码给出了这样的结果:

index: 3 => What
index: 0 => What
index: 0 => Given

答案 1 :(得分:6)

您可以尝试像<table> <tr> <td colspan="2" ></td> <td></td> </tr> <tr> <td> </td> <td> </td> <td> </td> </tr> <tr> <td> </td> <td> </td> <td> </td> </tr> </table>这样的regular expression,这意味着:

  • 单词\b[A-Z][a-z][^?]+\?的开头是大写字母\b,其后是小写字母[A-Z]
  • 然后是一系列非问号字符[a-z]
  • 后跟文字问号[^?]+

这仍然可能会有一些误报或遗漏,例如一个问题是否实际上以首字母缩写词开头,或者该问题的中间是否有名称,但是对于您来说,它的效果很好。

\?

如果这是一小段文字,则可以使用>>> tests = ["eo000 ATATAT EG\n\nWhat is your name?\nkgda dasflkjasn", "What is your\nlastname and email?\ndasf?lkjas", "\nGiven your skills\nhow would you rate yourself?\nand your name? dasf?"] >>> import re >>> p = r"\b[A-Z][a-z][^?]+\?" >>> [re.search(p, t).group() for t in tests] ['What is your name?', 'What is your\nlastname and email?', 'Given your skills\nhow would you rate yourself?'] 代替findall

search

实际上,这对于其中包含名称的问题似乎也相当有效:

>>> text = "\n".join(tests)
>>> re.findall(p, text)
['What is your name?',
 'What is your\nlastname and email?',
 'Given your skills\nhow would you rate yourself?']