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

时间:2013-08-06 16:34:33

标签: python string case

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

我还有一个名为“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."

但由于“匹配”背后有一段时间,因此不认为是匹配。

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

3 个答案:

答案 0 :(得分: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])

答案 1 :(得分: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.

答案 2 :(得分: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.