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

use*_*780 3 python regex

这个链接我使用以下代码:

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')
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我想打印__CODE____CODE__,它打印此:

re.compile('\\b(?:car|boot|truck)\\b')
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑:

我不能分开单词,__CODE__因为我并不总是知道会出现什么样的字符串.因此,如果列表中的一个单词在字符串中,则不一定是单独的单词.

EDIT2: 改为__CODE__.

Dav*_*nus 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')
Run Code Online (Sandbox Code Playgroud)

对于字符串"我在船上",re.match将失败,因为字符串的开头是"I",它与正则表达式不匹配.re.search也将不匹配第一个字符,但将通过字符串,直到它到达"船",此时它将找到匹配.

如果我们改为使用字符串"Boat is what is my on",re.match并且re.search将正则表达式与字符串匹配,因为字符串现在以匹配开头.


Wik*_*żew 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')
Run Code Online (Sandbox Code Playgroud)

查看IDEONE 演示

编辑

既然你说如果列表中的某个单词在字符串中,则它必须为真,不仅作为一个单独的单词,而且如果例如船库在字符串中,它也不能匹配,所以我建议首先替换非单词字符和_空格,然后使用您的正则表达式\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')
Run Code Online (Sandbox Code Playgroud)

这不会打印yay,但如果删除house,它就会打印。

请参阅IDEONE 演示 2