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
.youimport 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