1

我有一个名为“beats”的二维数组,其中包含一堆数据。在数组的第二列中,有一个按字母顺序排列的单词列表。

我还有一个叫做“words”的句子,它最初是一个字符串,我已经把它变成了一个数组。

我需要检查“words”中的一个单词是否与数组“beats”第二列中的任何单词匹配。如果找到匹配项,程序将句子“words”中的匹配词更改为“match”,然后以字符串形式返回这些词。这是我正在使用的代码:

i = 0
while i < len(words):
    n = 0
    while n < len(beats):
        if words[i] == beats[n][1]:
            words[i] = "match"
        n = n + 1
    i = i + 1
mystring = ' '.join(words)
return mystring

所以,如果我有这句话:

"Money is the last money."

而“money”在数组“beats”的第二列,结果是:

"match is the last match."

但是由于“匹配”后面有一个句点,所以它不认为它是匹配的。

比较两个字符串时有没有办法忽略标点符号?我不想去掉标点符号的句子,因为我希望在我的程序完成替换匹配项后返回字符串时标点符号保持完整。

4

3 回答 3

1

您可以使用正则表达式:

import re

st="Money is the last money."

words=st.split()
beats=['money','nonsense']

for i,word in enumerate(words):
    if word=='match': continue
    for tgt in beats:
        word=re.sub(r'\b{}\b'.format(tgt),'match',word,flags=re.I)
        words[i]=word

print print ' '.join(words)    

印刷

match is the last match.
于 2013-08-06T17:00:50.017 回答
1

您可以创建一个具有所需属性的新字符串,然后与新字符串进行比较。这将去除除数字、字母和空格之外的所有内容,同时将所有字母变为小写。

''.join([letter.lower() for letter in ' '.join(words) if letter.isalnum() or letter == ' '])

要从字符串中删除除字母之外的所有内容,您可以执行以下操作:

from string import ascii_letters
''.join([letter for letter in word if letter in ascii_letters])
于 2013-08-06T16:47:45.130 回答
0

如果它只是您担心的句号,那么您也可以添加另一个 if case 来匹配它。或类似的,如果您的案例有限,您可以添加自定义处理。否则正则表达式是要走的路。

  words="Money is the last money. This money is another money."
  words = words.split()
  i = 0
  while i < len(words):
    if (words[i].lower() == "money".lower()):
      words[i] = "match"
    if (words[i].lower() == "money".lower() + '.'):
      words[i] = "match."  
    i = i + 1

  mystring = ' '.join(words)
  print mystring

输出:

match is the last match. This match is another match.
于 2013-08-06T17:24:26.977 回答