如何检查另一个字符串中是否存在确切的字符串?

时间:2010-10-22 04:59:05

标签: python string pattern-matching

我目前遇到了一些问题。我正在尝试编写一个程序,该程序将突出显示另一个字符串中的单词或短语的出现,但前提是它匹配的字符串完全相同。我遇到麻烦的部分是确定我与短语匹配的副词是否包含在另一个更大的子词中。

一个显示此问题的简单示例:

>>> indicators = ["therefore", "for", "since"]
>>> phrase = "... therefore, I conclude I am awesome."
>>> indicators_in_phrase = [indicator for indicator in indicators 
                            if indicator in phrase.lower()]
>>> print indicators_in_phrase
['therefore', 'for']

我不希望该列表中包含'for'。我知道为什么它被包含在内,但是我想不出任何可以过滤掉像这样的子串的表达式。

我在网站上注意到了其他类似的问题,但每个问题都涉及一个Regex解决方案,这是我感觉不舒服的问题,特别是在Python中。有没有一种简单的方法可以在不使用Regex表达式的情况下解决这个问题?如果没有,那么相应的Regex表达式以及如何在上面的例子中实现它将非常感激。

8 个答案:

答案 0 :(得分:5)

方法没有正则表达式,但大多数方法都是如此令人费解,以至于您希望您花时间学习所需的简单正则表达式序列。< / p>

答案 1 :(得分:2)

这是正则表达式的一行...

import re

indicators = ["therefore", "for", "since"]
phrase = "... therefore, I conclude I am awesome."

indicators_in_phrase = set(re.findall(r'\b(%s)\b' % '|'.join(indicators), phrase.lower()))

答案 2 :(得分:2)

正则表达式是最简单的方法! 提示:

re.compile(r'\btherefore\b')

然后你可以改变中间的单词!

编辑:我是为你写的:

import re

indicators = ["therefore", "for", "since"]

phrase = "... therefore, I conclude I am awesome. "

def find(phrase, indicators):
    def _match(i):
        return re.compile(r'\b%s\b' % (i)).search(phrase)
    return [ind for ind in indicators if _match(ind)]

>>> find(phrase, indicators)
['therefore']

答案 3 :(得分:1)

我认为你要做的事情更像是这样:

import string

words_in_phrase = string.split(phrase)

现在,您将在列表中包含以下内容:

['...', 'therefore,', 'I', 'conclude', 'I', 'am', 'awesome.']

然后比较这样的列表:

indicators_in_phrase = []
for word in words_in_phrase:
  if word in indicators:
    indicators_in_phrase.append(word)

可能有几种方法可以减少这种冗长,但我更喜欢清晰。此外,您可能必须考虑删除标点符号,如“真棒”。和“因此,”

对于那个使用rstrip,如在另一个答案

答案 4 :(得分:1)

  1. 创建一组指标
  2. 创建短语集
  3. 查找交叉点
  4. <强>代码:

    indicators = ["therefore", "for", "since"]
    phrase = "... therefore, I conclude I am awesome."
    print list(set(indicators).intersection(set( [ each.strip('.,') for each in phrase.split(' ')])))
    

    干杯:)

答案 5 :(得分:0)

有点冗长,但给出了一个想法/当然正则表达式是为了简化

>>> indicators = ["therefore", "for", "since"]
>>> phrase = "... therefore, I conclude I am awesome."
>>> phrase_list = phrase.split()
>>> phrase_list
['...', 'therefore,', 'I', 'conclude', 'I', 'am', 'awesome.']
>>> phrase_list = [ k.rstrip(',') for k in phrase_list]
>>> indicators_in_phrase = [indicator for indicator in indicators if indicator in phrase_list]
>>> indicators_in_phrase 
['therefore']

答案 6 :(得分:0)

问题是“因为”它是在“因此”里面还是不是一个字?例如,如果您的某个指标是“敬畏”,您是否希望将其包含在indicators_in_phrase中?

您希望如何处理以下情况? indicators = [“abc”,“cde”] 短语=“一个abcde两个”

答案 7 :(得分:0)

您可以从短语中删除标点符号,然后对其进行拆分,以便所有单词都是单独的。然后你可以进行字符串比较

>>> indicators = ["therefore", "for", "since"]
>>> phrase = "... therefore, I conclude I am awesome."
>>> ''.join([ i for i in phrase.lower() if i not in string.punctuation]).strip().split()
['therefore', 'I', 'conclude', 'I', 'am', 'awesome']
>>> p = ''.join([ i for i in phrase.lower() if i not in string.punctuation]).strip().split()
>>> indicators_in_phrase = [indicator for indicator in indicators if indicator in p ]
>>> indicators_in_phrase
['therefore']