从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')
我做错了什么?
答案 0 :(得分:5)
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
将失败,因为字符串的开头是"我"它与正则表达式不匹配。 re.search
也不会与第一个字符匹配,而是通过字符串直到它到达" boat",此时它将找到匹配。
如果我们改为使用字符串" Boat就是我所在的" ,re.match
和re.search
都会将正则表达式与字符串匹配因为字符串现在以匹配开头。
答案 1 :(得分:3)
这不是一个常规句子,其中单词用下划线连接。由于您只是检查单词是否存在,您可以删除\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')
请参阅IDEONE demo
修改强>:
因为你说如果列表中的一个单词在字符串中,它不一定是真的,不仅仅是一个单独的单词,而是它是不匹配的,例如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
,则会显示。{/ p>