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

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,它会。

IDEONE Demo 2

另一答案

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.matchre.search都会将正则表达式与字符串匹配,因为字符串现在以匹配开头。

以上是关于使用re.match匹配字符串不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL REGEXP数字精确匹配不起作用

re模块的高级用法

javascript正则中使用[\s\S]*用来匹配任意字符(包括换行符)的方法不起作用

正则表达式

媒人自动匹配不起作用

python正则表达式中的匹配括号[重复]