首页 > 解决方案 > 列表理解中的 Python 3.5.2 正则表达式返回所有条目 - 与其他示例不一致

问题描述

我正在搜索特定条目的列表。条目是数字后跟斜线(一次或多次)。

如果我将示例放入字符串并使用 re.match() 我会得到结果。

如果我将字符串放入一个列表并循环,我会从 re.match() 得到一个结果

如果我尝试使用列表理解获取索引,我会返回所有列表索引。

使用不同的列表,我得到了正确的结果。

为什么我的正则表达式的列表理解不只是像控制列表那样返回 [2] ?

示例代码:

import re
import sys
from datetime import datetime
rxco = re.compile
rx = {}

#String
s = r'140/154/011/002'

#String in a list
l = ['abc', 'XX123 SHDJ FFFF', s, 'unknown', 'TTL/4/5/6', 'ORD/123']

#Regex to get what I am interested in
rx['ls_pax_split'] = rxco(r'\s?((\d+\/?)*)') 

#For loop returns matches and misses
for i in l:
    m = re.match(rx['ls_pax_split'], i)
    print(m)

#List Comprehension returns ALL entries - NOT EXPECTED
idx = [i for i, item in enumerate(l) if re.match(rx['ls_pax_split'], item)]
print(idx)

#Control Comprehension returns - AS EXPECTED
fruit_list = ['raspberry', 'apple', 'strawberry']
berry_idx = [i for i, item in enumerate(fruit_list) if re.match('rasp', item)]
print(berry_idx)

标签: regexpython-3.xlist-comprehension

解决方案


re.match(rx['ls_pax_split'], item)每次运行时都返回一个匹配对象,而re.match('rasp', item)不是。因此,结果re.match(rx['ls_pax_split'], item)总是真实的。

尝试添加.group(0)到第 22 行的末尾以获取与正则表达式匹配的字符串,如果没有匹配,则添加一个空字符串(即错误值)。

像这样:

idx = [i for i, item in enumerate(l) if re.match(rx['ls_pax_split'], item).group(0)]

编辑

虽然以上将解决这个问题,但可能有更好的方法来避免处理.group. 正则表达式(\d+\/?)*将匹配(\d+\/?)零次或多次,这意味着它会生成大量误报,其中它检测到零匹配并因此返回匹配。将其更改为(\d+\/?)+将通过查找一个或多个来解决此示例(\d+\/?)


推荐阅读