Я пытаюсь извлечь номер детали из строки. Я собираюсь перебирать элементы, и мне нужно извлечь элемент, если он имеет длину более 4 символов и содержит КАК МИНИМУМ 1 число. Он не обязательно должен включать буквы, но может.

Например:

Line1: 'There is some random information here'
Line2: 'This includes item p23344dd5 as well as other info'
Line3: 'K3455 $100.00'
Line4: 'Last part number here 5551234'

Мне нужно извлечь 3 номера элементов: p23344dd5, K3455 и 5551234.

Я использую этот код, но он просто возвращается, если он соответствует, а это не то, что мне нужно. Мне нужно вернуть совпавший текст.

import re

items = ['There is some random information here',
         'This includes item p23344dd5 as well as other info',
         'K3455 $100.00',
         'Line4: ''Last part number here 5551234']

for item in items:
    x = re.search(r'^(?=.*\d).{5,}$', item)
    print(x)
0
Lzypenguin 16 Янв 2021 в 23:47

2 ответа

Лучший ответ

Чтобы сопоставить значения в вопросе, вы можете указать не менее 5 символов слова из границы пробела, а затем сопоставить хотя бы одну цифру.

(?<!\S)(?=\w{5})[^\W\d]*\d\w*(?!\S)

Объяснение

  • (?<!\S) Граница пробела слева
  • (?=\w{5}) Утвердить 5 символов слова
  • [^\W\d]* Сопоставление необязательных символов слов без цифры
  • \d Соответствует 1 цифре
  • \w* Сопоставление необязательных символов слов
  • (?!\S) Установите границу пробела справа

демонстрация регулярного выражения | Демонстрация Python

import re

items = ['There is some random information here',
         'This includes item p23344dd5 as well as other info',
         'K3455 $100.00',
         'Line4: ''Last part number here 5551234']

for item in items:
    x = re.search(r'(?<!\S)(?=\w{5})\w*\d\w*(?!\S)', item)
    if x:
        print(x.group())

p23344dd5
K3455
5551234
2
The fourth bird 16 Янв 2021 в 20:58

Вот как извлечь соответствующий текст. Это не решает проблему с регулярным выражением, как упоминалось в комментариях, но извлекает соответствующее значение, как вы просили. Проблема в том, что вся строка соответствует тому, как вы написали регулярное выражение.

import re

items = ['There is some random information here',
         'This includes item p23344dd5 as well as other info',
         'K3455 $100.00',
         'Line4: ''Last part number here 5551234']

for item in items:
    m = re.search(r'^(?=.*\d).{5,}$', item)
    if m is not None:
        print(m.group(0))
1
user984003 16 Янв 2021 в 21:06