Python 在字符串中查找短语

Python 在字符串中查找短语,python,string,Python,String,我试图检查字符串中是否存在短语“紫色奶牛”。“紫色”和“牛”之间必须至少有一个空格或标点符号;“紫光”是不可接受的。我尝试了以下程序,但收到一条错误消息 import string def findPC(string): strLower = string.lower() # remove 'purplecow' in strLower strLowerB = strLower.replace('purplecow', '') print(strLowerB

我试图检查字符串中是否存在短语“紫色奶牛”。“紫色”和“牛”之间必须至少有一个空格或标点符号;“紫光”是不可接受的。我尝试了以下程序,但收到一条错误消息

import string

def findPC(string):

    strLower = string.lower()

    # remove 'purplecow' in strLower
    strLowerB = strLower.replace('purplecow', '')
    print(strLowerB)

    strList = list(strLowerB)
    print(strList)

    # remove punctuation in strLowerB
    punct = string.punctuation()
    for char in strList:
        if char in punct:
            strList.replace(char, '')

    # remove spaces in strLowerB
    strLower.replace(' ', '')
    print(strLower)

    # look for 'purplecow' in strLowerB
    return 'purplecow' in string


print(findPC('The purple cow is soft and cuddly. purplecow. Purple^&*(^&$cow.'))
错误消息:

Traceback(最近一次调用last):文件“C:/Python36/findPC.py”,
第28行,在
打印(findPC('purple cow.purple cow.purple^&*(^&$cow.'))文件“C:/Python36/findPC.py”,第15行,在
findPC
punct=string.percentration()AttributeError:'str'对象没有属性'percentration'

使用正则表达式

import re

# 'at least space or punctuation mark` - depends on that is treated a punctuation mark. I've put comma and hyphen, you can extend the list
r = r'purple[\s\,\-]+cow' 
s = 'The purple cow is soft and cuddly. purplecow.Purple^&*(^&$cow.'

print('Found' if re.search(r, s) else 'Not found')

使用正则表达式

import re

# 'at least space or punctuation mark` - depends on that is treated a punctuation mark. I've put comma and hyphen, you can extend the list
r = r'purple[\s\,\-]+cow' 
s = 'The purple cow is soft and cuddly. purplecow.Purple^&*(^&$cow.'

print('Found' if re.search(r, s) else 'Not found')

如果您可以使用正则表达式,那么您可以使用符合您需要的格式为
purple[,\/\\!$%\^&\*;:{}=\-\u`~()]+cow
的正则表达式来实现这一点

注意:方括号中的字符是您正在考虑的“标点符号”。
+
表示您正在匹配一行中方括号中的一个或多个字符

这是在Python中实现的,如下所示:

import re
re.search(r"purple[ .,\/#!$%\^&\*;:{}=\-_`~()]+cow", string)
re.search(pattern,string)
将为您提供一个
re.Match
对象,其中包含有关匹配的更多信息(如果没有匹配项,则提供一个
None
),但如果您只需要一个
true/false
值来指示正则表达式是否匹配,则可以这样实现:

matched = not re.search(pattern, string) == None
因此,这意味着您可以实现如下代码:

import re
def findPC(s):
    return not re.search(r"purple[ .,\/#!$%\^&\*;:{}=\-_`~()]+cow", s) == None
您可以在这样的网站上测试正则表达式,例如这一个:


编辑:改进的正则表达式

如果你可以使用正则表达式,你可以用符合你需要的形式的正则表达式来实现它

注意:方括号中的字符是您正在考虑的“标点符号”。
+
表示您正在匹配一行中方括号中的一个或多个字符

这是在Python中实现的,如下所示:

import re
re.search(r"purple[ .,\/#!$%\^&\*;:{}=\-_`~()]+cow", string)
re.search(pattern,string)
将为您提供一个
re.Match
对象,其中包含有关匹配的更多信息(如果没有匹配项,则提供一个
None
),但如果您只需要一个
true/false
值来指示正则表达式是否匹配,则可以这样实现:

matched = not re.search(pattern, string) == None
因此,这意味着您可以实现如下代码:

import re
def findPC(s):
    return not re.search(r"purple[ .,\/#!$%\^&\*;:{}=\-_`~()]+cow", s) == None
您可以在这样的网站上测试正则表达式,例如这一个:


编辑:改进的Regex

您代码中的错误源于您在两个地方使用了
string
,这两个地方的含义不同。我对您的代码进行了一些编辑,以使其按照您的预期方式工作

import string

def findPC(input_string):

    strLower = input_string.lower()

    # remove 'purplecow' in strLower
    strLowerB = strLower.replace('purplecow', '')
    print(strLowerB)

    # remove punctuation in strLowerB
    punct = string.punctuation
    for char in punct:
      strLowerB = strLowerB.replace(char, '')

    # remove spaces in strLowerB
    strLowerB.replace(' ', '')
    print(strLowerB)

    # look for 'purplecow' in strLowerB
    return 'purplecow' in strLowerB


print(findPC('The purple cow is soft and cuddly. purplecow. Purple^&*(^&$cow.'))

代码中的错误源于您在两个地方使用了
string
,它们的含义不同。我对您的代码进行了一些编辑,以使其按照您的预期方式工作

import string

def findPC(input_string):

    strLower = input_string.lower()

    # remove 'purplecow' in strLower
    strLowerB = strLower.replace('purplecow', '')
    print(strLowerB)

    # remove punctuation in strLowerB
    punct = string.punctuation
    for char in punct:
      strLowerB = strLowerB.replace(char, '')

    # remove spaces in strLowerB
    strLowerB.replace(' ', '')
    print(strLowerB)

    # look for 'purplecow' in strLowerB
    return 'purplecow' in strLowerB


print(findPC('The purple cow is soft and cuddly. purplecow. Purple^&*(^&$cow.'))

使用正则表达式更改带有空格的标点符号,然后使用另一个正则表达式删除额外的空格,怎么样

重新导入
string=re.sub(“[.!?\ \-,]”,“”,string)
string=re.sub(“\s+”,“”,string)
那你就可以把我们带进去了:
字符串中的“紫色奶牛”
因此,最终的功能变成:

def有紫色的(字符串):
进口稀土
string=re.sub(“[.!?\ \-,]”,“”,string)
string=re.sub(“\s+”,“”,string)
返回字符串中的“紫色奶牛”

使用正则表达式更改带有空格的标点符号,然后使用另一个正则表达式删除多余的空格,怎么样

重新导入
string=re.sub(“[.!?\ \-,]”,“”,string)
string=re.sub(“\s+”,“”,string)
那你就可以把我们带进去了:
字符串中的“紫色奶牛”
因此,最终的功能变成:

def有紫色的(字符串):
进口稀土
string=re.sub(“[.!?\ \-,]”,“”,string)
string=re.sub(“\s+”,“”,string)
返回字符串中的“紫色奶牛”

“收到错误消息”不是问题描述。请在帖子中指定确切的错误消息您收到了什么错误消息?您可以将其包含在帖子中吗?您不允许使用正则表达式,这样做会容易得多吗?现在,您可能意识到了这一点,也可能没有意识到这一点,但您的函数对传递的变量使用了名称
string
.you
import string
,但在函数作用域中,该模块名称在本地作用域中被覆盖。在这种情况下,除了使用正则表达式的更优雅的解决方案外,唯一的问题似乎不是名称阴影。投票关闭只是因为键入错误。“收到错误消息”不是问题描述。请在帖子中指定确切的错误消息您收到了什么错误消息?您可以将其包含在帖子中吗?您不允许使用正则表达式,这样做会容易得多吗?现在,您可能意识到了这一点,也可能没有意识到这一点,但您的函数对传递的变量使用了名称
string
.you
导入字符串
,但在函数范围内,该模块名称在本地范围内被覆盖。在这种情况下,除了使用正则表达式的更优雅的解决方案外,唯一的问题似乎不是名称阴影。投票关闭只是因为键入错误。这不是唯一的问题。您已经默默地纠正了
字符串.标点符号
不可调用并删除了将其转换为列表行的错误。但是,您仍然对各种名称执行一系列操作,并且最终在输入字符串中的
return…中忽略所有这些操作。这也与
“p u r p l e c o w”匹配
这不是唯一的问题。您已经默默地纠正了
字符串的事实。标点符号
不可调用,并删除了将其转换为列表行的错误。但是,您仍然对各种名称执行一系列操作,最后在输入字符串
中对
返回…忽略所有这些操作。这也与
“p u r p l e c o w”
只要用这个regexThanks替换“purple.+cow”就可以修复我的正则表达式,people@tobias_k只要用这个regexThanks替换“purple.+cow”就可以修复我的正则表达式,peop