使用re.match匹配字符串不起作用

时间:2015-05-21 20:23:32

标签: python regex

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')

我做错了什么?

2 个答案:

答案 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.matchre.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>

请参阅IDEONE Demo 2