首页 > 解决方案 > re.search() 不匹配所有预期的字符串

问题描述

我有以下功能,我已将打印语句进行测试:

def parse_tag_id(id_string):
    if not isinstance(id_string, str):
        id_string = str(id_string)
    if re.search(f'[0-9]{5}', id_string):
        print(f'MATCH: #{id_string}#')    # I put the '#' around each to make sure there are no hidden whitespaces.
    else:
        print(f'NO MATCH: #{id_string}#')
    return None

然后,我将其应用于 pandas DataFrame 的列,并得到以下结果:

MATCH: #73844 / 73845#
MATCH: #73844 / 73845#
MATCH: #83793 / 84758#
MATCH: #73844 / 73845 / 84122 / 84136#
MATCH: #73844 / 73845 / 84136#
NO MATCH: #Not live yet#
NO MATCH: #83046#                         INCORRECT
MATCH: #84120 / 82795#
NO MATCH: #Not live yet#
NO MATCH: #Not live yet#
NO MATCH: #84264#                         INCORRECT
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
NO MATCH: #Not live yet#
NO MATCH: #Not live yet#
MATCH: #73844 / 73845#
NO MATCH: #78787 / 78788#                 INCORRECT
MATCH: #84856#
MATCH: #82795#
MATCH: #84857 / 82795#
MATCH: #82795#
MATCH: #82795#
NO MATCH: #Not live yet#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #84845#
MATCH: #75891 / 75892#
MATCH: #75891 / 75892#
MATCH: #75891 / 75892#
MATCH: #75891 / 75892#
MATCH: #75891 / 75892#
MATCH: #75891 / 75892#
MATCH: #75891 / 75892#
MATCH: #75891 / 75892#
NO MATCH: #Not live yet#
NO MATCH: #Not live yet#
NO MATCH: #Not live yet#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #83759#
NO MATCH: #Not live yet#
NO MATCH: #Not live yet#
NO MATCH: #84814#                      INCORRECT
MATCH: #84815#
NO MATCH: #Not live yet#
NO MATCH: #nan#
NO MATCH: #84118#                      INCORRECT
NO MATCH: #Not live yet#
NO MATCH: #84640#                      INCORRECT
MATCH: #84591#
NO MATCH: #84660#                      INCORRECT
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #82795#
MATCH: #75891 / 75892#

我希望所有带有一个 5 位数字或“/”分隔的 5 位数字列表的所有字符串都返回 true,但我在上面用“不正确”标记了不正确的字符串。

为什么这没有按预期工作?

标签: pythonregex

解决方案


因为这:

>>> f'[0-9]{5}'
'[0-9]5'
>>> r'[0-9]{5}'
'[0-9]{5}'

f 字符串仅用于格式化。始终对正则表达式使用 r 字符串以避免双重转义。


推荐阅读