【问题标题】:Matching strings with re.match doesn't work用 re.match 匹配字符串不起作用
【发布时间】:2015-05-21 20:23:31
【问题描述】:

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

我做错了什么?

【问题讨论】:

  • 使用re.search。 re.match:如果字符串开头的零个或多个字符与正则表达式模式匹配,则返回相应的MatchObject实例。如果字符串与模式不匹配,则返回 None;请注意,这与零长度匹配不同。
  • @stribizhev,它返回相同的结果。
  • 那么请显示足够的代码来重现问题。
  • @stribizhev 抱歉,我添加了要匹配的字符串
  • @user3605780 如果正则表达式将字符串与搜索匹配,那么问题出在哪里?

标签: python regex


【解决方案1】:

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”,此时它会找到匹配项。

如果我们改为使用字符串“我正在上的船”,re.match 和re.search 都会将正则表达式匹配到字符串,因为字符串现在以匹配开始。

【讨论】:

    【解决方案2】:

    这不是一个用下划线连接单词的常规句子。由于您只是检查单词是否存在,您可以删除 \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

    编辑:

    既然你说如果列表中的单词之一在字符串中,它必须是真的,不仅作为一个单独的单词,而且它不能匹配,例如船屋在字符串中,我建议先用空格替换非单词字符和_,然后使用\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.sub(r'[\W_]', ' ', my_other_string),然后应用\b 的正则表达式:my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list))。
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多