在Python中匹配字符串中的精确短语

时间:2017-12-06 19:08:41

标签: python string python-3.x match

我试图确定子字符串是否在字符串中。 我遇到的问题是,如果在字符串中的另一个单词中找到子字符串,我不希望我的函数返回True。

例如:如果子串是; "紫牛" 而字符串是; "紫色奶牛是最好的宠物。" 这应该返回False。由于母牛在子串中不是复数。

如果子串是; "紫牛" 而字符串是; "你的紫牛践踏了我的树篱!" 会返回True

我的代码看起来像这样:

def is_phrase_in(phrase, text):
    phrase = phrase.lower()
    text = text.lower()

    return phrase in text


text = "Purple cows make the best pets!"
phrase = "Purple cow"
print(is_phrase_in(phrase, text)

在我的实际代码中,我清理了“文本”中不必要的标点符号和空格。在将它与短语进行比较之前,否则这是相同的。 我尝试过使用re.search,但我还没有很好地理解正则表达式,只能从我的示例中获得相同的功能。

感谢您提供的任何帮助!

5 个答案:

答案 0 :(得分:6)

由于您的短语可以包含多个单词,因此执行简单的拆分和交叉将不起作用。我会选择正则表达式:

import re

def is_phrase_in(phrase, text):
    return re.search(r"\b{}\b".format(phrase), text, re.IGNORECASE) is not None

phrase = "Purple cow"

print(is_phrase_in(phrase, "Purple cows make the best pets!"))   # False
print(is_phrase_in(phrase, "Your purple cow trampled my hedge!"))  # True

答案 1 :(得分:1)

使用PyParsing:

import pyparsing as pp

def is_phrase_in(phrase, text):
    phrase = phrase.lower()
    text = text.lower()

    rule = pp.ZeroOrMore(pp.Keyword(phrase))
    for t, s, e in rule.scanString(text):
      if t:
        return True
    return False

text = "Your purple cow trampled my hedge!"
phrase = "Purple cow"
print(is_phrase_in(phrase, text))

哪个产量:

True

答案 2 :(得分:0)

人们可以通过循环

完全实现这一点
phrase = phrase.lower()
text = text.lower()

answer = False 
j = 0
for i in range(len(text)):
    if j == len(phrase):
        return text[i] == " "
    if phrase[j] == text[i]:
        answer = True
        j+=1
    else:
        j = 0 
        answer = False 
return answer

或者通过拆分

phrase_words = phrase.lower().split()
text_words = text.lower().split()

return phrase_words in text_words

或使用正则表达式

import re
pattern = re.compile("[^\w]" + text + ""[^\w]")
pattern.match(phrase.lower())

说我们不希望在文本之前或之后有任何字符,但是空格是可以的。

答案 3 :(得分:0)

正则表达式应该起作用

import re

def is_phrase_in(phrase, text):
    phrase = phrase.lower()
    text = text.lower()
    if re.findall('\\b'+phrase+'\\b', text):
        found = True
    else:
        found = False
    return found

答案 4 :(得分:0)

您在这里,希望对您有帮助

 # Declares
 string = "My name is Ramesh and I am cool. You are Ram ?"
 sub = "Ram"

 # Check String For SUb String
 result = sub in string

 # Condition Check
 if result:

    # find starting position
    start_position = string.index(sub)

    # get stringlength
    length = len(sub)

    # return string
    output = string[start_position:len]