Извлечение кодов с помощью регулярных выражений (неправильные ключи регулярных выражений) - PullRequest
1 голос
/ 01 июля 2019

Я извлекаю коды из списка строк, используя заголовок из электронного письма. Который выглядит примерно так:

text_list = ['Industry / Gemany / PN M564839', 'Industry / France / PN: 575-439', 'Telecom / Gemany / P/N 26-59-29', 'Mobile / France / P/N: 88864839']

Пока что я попробовал:

def get_p_number(text):
    rx = re.compile(r'[p/n:]\s+((?:\w+(?:\s+|$)){1})',
                    re.I)
    res = []
    m = rx.findall(text)
    if len(m) > 0:
        m = [p_number.replace(' ', '').upper() for p_number in m]
        m = remove_duplicates(m)
        res.append(m)
    else:
        res.append('no P Number found')
    return res

Моя проблема в том, что я не могу извлечь код рядом со словами, которые идут до ['PN', 'P/N', 'PN:', 'P/N:'], особенно если код после начинается с буквы (то есть 'M') или если он имеет косую черту между это (т.е. 26-59-29).

Мой желаемый результат будет:

res = ['M564839','575-439','26-59-29','888489']

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Простой шаблон M?[-\d]+ должен работать на вас. Вот демо:

import re

text_list = ['Industry / Gemany / PN M564839', 'Industry / France / PN: 575-439', 'Telecom / Gemany / P/N 26-59-29', 'Mobile / France / P/N: 88864839']

res = []
for elem in text_list:
    for code in re.findall(r'M?[-\d]+', elem):
        res.append(code)

print(res)

Выход:

['M564839', '575-439', '26-59-29', '88864839']
1 голос
/ 01 июля 2019

В вашем шаблоне класс персонажа [p/n:]\s+ будет соответствовать одному из перечисленных, за которым следуют 1+ пробельные символы.В примере данных, которые будут соответствовать прямой косой черте или двоеточию, за которым следует пробел.

Следующая часть (?:\w+(?:\s+|$)) будет соответствовать 1+ символам слова, за которыми следует либо конец строки, либо 1+ пробельных символов безпринимая во внимание символ пробела в середине или дефис.

Один из вариантов - сопоставить PN с необязательными : и / вместо использования класса символов [p/n:] и указать свое значение вгруппа захвата:

/ P/?N:? ([\w-]+)

Regex demo | Python demo

Например:

import re
text_list = ['Industry / Gemany / PN M564839', 'Industry / France / PN: 575-439', 'Telecom / Gemany / P/N 26-59-29', 'Mobile / France / P/N: 88864839']
regex = r"/ P/?N:? ([\w-]+)"
res = []
for text in text_list: 
    matches = re.search(regex, text)
    if matches:
        res.append(matches.group(1))

print(res)

Результат

['M564839', '575-439', '26-59-29', '88864839']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...