На самом деле должно быть что-то, что позволяет пользователям с более чем 50 или более точками повторения комментировать, потому что эта тема - одна из тех, которые мне действительно интересны и которые я хочу раскошелиться, но не хотел иметьдать полноценный ответ, потому что ответ, который я даю, включает в себя конечные ситуации и не гибкий.
@ Wiktor Stribiżew
Ваше решениепропускает "Реф."часть вывода на основе вашей демонстрации.Похоже, он хочет пропустить "tramite"
@ checkmate
В желаемом выводе вам нужно отредактировать его, потому что "UV1234" нигде не отображается вотправленная вами строка
.
В любом случае, я нашел решение, но очень надеюсь, что кто-то может улучшить это.
>>> import re
>>> string = '''some text before Expedien: 1-21-212-16-26 some random text
Reference RE9833 of all sentences.
abc
123
456
something blah blah Ref.:
tramite 1234567
Ref.:
some junk Expedien N° 18-00777 # some new content
some text Expedien N°18-0022995 # some garbled content'''
>>> re.findall('(?:(Expedien[\s]+N\S|Ref\.(?!:[\S\s]{,11}Expedien)|Reference|Expedien))[\S\s]*?([A-Z\-]*(?:[\d]+)[\S]*)', string)
[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('Ref.', '1234567'), ('Expedien N\xb0', '18-00777'), ('Expedien N\xb0', '18-0022995')]
Недостатки:
- Для правильного захвата он частично полагается на "Ссылка (?!: [\ S \ s] {, 11} Expedien)"
- Во-первых, «11» необходимо отредактировать, чтобы учесть другие объемы информации, которая может присутствовать, поэтому она не является гибкой
- Во-вторых, если вместо этого следует «Ссылка» какпротив тогдашнего третьего "Реф."будет захвачено неправильно