使用re.match匹配字符串不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用re.match匹配字符串不起作用相关的知识,希望对你有一定的参考价值。
从this链接我使用以下代码:
my_other_string = 'the_boat_has_sunk'
my_list = ['car', 'boat', 'truck']
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list))
if re.match(my_list, my_other_string):
print('yay')
但它不起作用。我在re.compile之后尝试打印my_list并打印出来:
re.compile('\\b(?:car|boot|truck)\\b')
我究竟做错了什么?
答案
这不是一个常规句子,其中单词与下划线连接。由于您只是检查单词是否存在,您可以删除\b
(因为它匹配单词边界,_
是单词字符!)或添加替代品:
import re
my_other_string = 'the_boat_has_sunk'
my_list = ['car', 'boat', 'truck']
my_list = re.compile(r'(?:\b|_)(?:%s)(?=\b|_)' % '|'.join(my_list))
if re.search(my_list, my_other_string):
print('yay')
编辑:
既然你说它必须是真的,如果列表中的一个单词在字符串中,不仅作为一个单独的单词,但如果例如boathouse在字符串中它不匹配,我建议先替换非单词字符和_
与空格,然后使用你与\b
的正则表达式:
import re
my_other_string = 'the_boathouse_has_sunk'
my_list = ['car', 'boat', 'truck']
my_other_string = re.sub(r'[\W_]', ' ', my_other_string)
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list))
if re.search(my_list, my_other_string):
print('yay')
这不会打印yay
,但如果你删除house
,它会。
另一答案
re.match
仅将输入字符串的开头与正则表达式匹配。所以这只适用于以my_list
的字符串开头的字符串。
另一方面,re.search
搜索整个字符串以匹配正则表达式。
import re
my_list = ['car', 'boat', 'truck']
my_other_string = 'I am on a boat'
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list))
if re.search(my_list, my_other_string):#changed function call here
print('yay')
对于字符串“我在船上”,re.match
将失败,因为字符串的开头是“I”,它与正则表达式不匹配。 re.search
也不会匹配第一个字符,而是会通过字符串直到它到达“船”,此时它将找到一个匹配。
如果我们改为使用字符串“Boat is what is what on”,re.match
和re.search
都会将正则表达式与字符串匹配,因为字符串现在以匹配开头。
以上是关于使用re.match匹配字符串不起作用的主要内容,如果未能解决你的问题,请参考以下文章