【问题标题】:Ignore punctuation and case when comparing two strings in Python在 Python 中比较两个字符串时忽略标点符号和大小写
【发布时间】:2013-08-06 16:34:32
【问题描述】:

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

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

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

【问题讨论】:

  • 应该words = "match" 不是words[i] = "match"?您似乎正在用字符串“match”覆盖您的 words 数组。
  • 我打错了,原来是这样,谢谢,我改一下。

标签: python string case


【解决方案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])

【讨论】:

  • 我想保留单词的现有大小写,但我想保持所有逗号都完好无损。
  • 是为了比较,还是为了输出字符串?进行列表推导将不会改变任何东西的值(除了你分配给它的东西)。
  • 例如,如果句子是“嘿,我的名字是,鲍勃”,那么二维数组将是 ["Hey,", "my", "name", "is, ", "鲍勃"]。如果 3-D 数组中存在单词“name”,它不会返回“Hey,my match, is bob”(这是我希望它返回的),因为“name”不匹配“名称”。我只想在比较字符串时忽略标点符号。
  • 在这种情况下,您将需要使用正则表达式。
  • 谢谢,我会用正则表达式
【解决方案2】:

你可以使用正则表达式:

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 word == 'match': continue”这行是什么意思,因为它不是在搜索“match”这个词?我只是好奇,因为它有效,但我不明白。
  • 这只是一个演示。您需要根据您的数据结构对其进行调整,因为您没有提供足够的示例。
  • if word == 'match': continue 行只是跳过了上一场比赛。我想没必要……
  • 感谢您帮我解决这个问题,感谢您抽出宝贵时间,我将使用正则表达式重写我的代码。
【解决方案3】:

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

  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.

【讨论】:

  • 感谢您的回答,正则表达式肯定是要走的路
猜你喜欢
  • 1970-01-01
  • 2016-01-29
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
相关资源
最近更新 更多