3

python /编程新手,所以不太清楚如何表达这个......

我要做的是:输入一个句子,找到输入句子的所有匹配项和一组存储的句子/字符串,并返回匹配字符串的最长组合。

我认为答案与正则表达式有关,但我还没有开始这些,如果我不需要的话也不想这样做。

我的问题:正则表达式是解决这个问题的方法吗?或者有没有办法在不导入任何东西的情况下做到这一点?

如果它可以帮助您理解我的问题/想法,这是我正在尝试做的伪代码:

input = 'i play soccer and eat pizza on the weekends'
focus_word = 'and'

ss = [
      'i play soccer and baseball',
      'i eat pizza and apples',
      'every day i walk to school and eat pizza for lunch',
      'i play soccer but eat pizza on the weekend',
     ]

match = MatchingFunction(input, focus_word, ss)
# input should match with all except ss[3]

ss[0]match= 'i play soccer and'
ss[1]match = 'and'
ss[2]match = 'and eat pizza'

#the returned value match should be 'i play soccer and eat pizza'
4

1 回答 1

4

听起来您想在输入字符串和数据库中的每个字符串之间找到最长的公共子字符串。假设您有一个函数 LCS 可以找到两个字符串中最长的公共子字符串,您可以执行以下操作:

> [LCS(input, s) for s in ss]
['i play soccer and ',
 ' eat pizza ',
 ' and eat pizza ',
 ' eat pizza on the weekend']

然后,听起来您正在寻找字符串列表中重复次数最多的子字符串。(如果我错了,请纠正我,但我不太确定您在一般情况下要查找的内容!)从上面的数组输出中,您将使用哪种字符串组合来创建输出字符串?


根据您的评论,我认为这应该可以解决问题:

> parts = [s for s in [LCS(input, s) for s in ss] if s.find(focus_word) > -1]
> parts
['i play soccer and ', ' and eat pizza ']

然后,要摆脱此示例中的重复单词:

> "".join([parts[0]] + [p.replace(focus_word, "").strip() for p in parts[1:]])
'i play soccer and eat pizza'
于 2012-09-29T17:24:44.653 回答