Python 3.5.2 Регулярное выражение в понимании списка возвращает все записи - несовместимо с другим примером - PullRequest
1 голос
/ 19 сентября 2019

Я ищу список для определенной записи.Запись состоит из цифр, за которыми следует косая (один или много раз).

Если я помещу пример в строку и использую re.match (), я получу результат.

Если я поставлюСтрока в список и цикл через, я получаю результат от re.match ()

Если я пытаюсь получить индекс, используя понимание списка, я получаю все возвращенные индексы списка.

Использование другогоlist Я получаю правильный результат.

Почему понимание моего списка для моего регулярного выражения не просто возвращает [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)

1 Ответ

0 голосов
/ 19 сентября 2019

re.match(rx['ls_pax_split'], item) возвращает объект совпадения каждый раз, когда он выполняется, тогда как re.match('rasp', item) - нет.Поэтому результат re.match(rx['ls_pax_split'], item) всегда верен.

Попробуйте добавить .group(0) в конец строки 22, чтобы получить строку, которая соответствует регулярному выражению, или пустую строку (то есть значение Falsey), еслисовпадений не было.

Примерно так:

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

РЕДАКТИРОВАТЬ

Хотя вышеизложенное решит эту проблему, возможно, существует лучший способчтобы избежать хлопот с .group.Регулярное выражение (\d+\/?)* будет соответствовать (\d+\/?) ноль или более раз, что означает, что оно генерирует много ложных срабатываний, когда оно обнаруживает ровно ноль совпадений и, следовательно, возвращает совпадение.Изменение этого значения на (\d+\/?)+ решит проблему для этого примера, ища один или несколько (\d+\/?).

...