在Python中比较两个字符串时忽略标点和大小写

在Python中比较两个字符串时忽略标点和大小写,python,string,case,Python,String,Case,我有一个叫做“beats”的二维数组,里面有一堆数据。在数组的第二列中,有一个按字母顺序排列的单词列表 我还有一个名为“words”的句子,它最初是一个字符串,我把它变成了一个数组 我需要检查“words”中的一个单词是否与数组“beats”第二列中的任何单词匹配。如果找到匹配项,程序会将句子“words”中匹配的单词更改为“match”,然后以字符串形式返回单词。这是我正在使用的代码: i = 0 while i < len(words): n = 0 while n &

我有一个叫做“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”在数组“beats”的第二列中,结果将是:

"match is the last match."
但是由于“比赛”有一段时间,所以不认为它是一个匹配。
在比较两个字符串时,有没有办法忽略标点符号?我不想去掉句子中的标点符号,因为我希望在程序完成替换匹配项后返回字符串时,标点符号能够准确无误。

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

''.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])
您可以使用正则表达式:

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.

如果您担心的只是句号,那么您也可以添加另一个If case来匹配它。或者,如果您的案例有限,您可以添加自定义处理。否则,regex就是最好的选择

  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

是否应该
words=“match”
不是
words[i]=“match”
?您似乎正在用字符串“match”覆盖
单词
数组。我打错了,就是这样,谢谢,我会更改它。我想保留单词的现有大小写,但我想保留所有逗号。为了比较,还是为了输出字符串?执行列表理解不会更改任何内容的值(除了您指定的内容)。因此,例如,如果句子是“嘿,我的名字是,鲍勃”,则二维数组将是[“嘿”,“我”,“我的名字”,“是”,“鲍勃]”。如果单词“name”存在于三维数组中,它不会返回“Hey,my match,is bob”(这是我希望它返回的内容),因为“name”与“name”不匹配。我只想在比较字符串时忽略标点符号。在这种情况下,您将需要使用正则表达式。谢谢,我将使用正则表达式“if word=='match':continue”行的意思是什么,因为它没有搜索单词“match”?我只是好奇,因为它能工作,但我不明白。这只是一个演示。由于没有提供足够的示例,您需要对其进行调整以适应您的数据结构。如果word=='match':continue(继续)
这一行跳过了以前的匹配。我想没必要…谢谢你帮我解决这个问题,也谢谢你花时间,我会用regex重写我的代码。谢谢你的回答,regex肯定是一个不错的选择
  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.