Получить число, присутствующее после определенного шаблона совпадающей строки, состоящей из слова и числа - PullRequest
0 голосов
/ 18 марта 2019

Это входная строка:

text Expedien N0 18-00232995
$cat input_file
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

Для других строк: Этот код работает, но я хочу также получить, если слово состоит из числа, и я хочу найти число после этого соответствия (слово-номер присутствует в списке как сущность) и поэтому в таком случае:

получает выходные данные ('Expedien', 'N0'), но ожидаемый результат равен ('Expedien N0', '18 -00232995 ').

Код, извлекающий другие объекты, выглядит следующим образом:

import re
s="""your_text_here"""
my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien', 'Expedien N0']
rx = r'(?<!\w)({})\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)'.format('|'.join(map(re.escape,my_list)))
print(re.findall(rx, s))

Вывод:

[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('tramite', '1234567'), ('Expedien N°', '18-00777'), ('Expedien N°', '18-0022995')]

Как получить ('Expedien N0', '18-00232995 ') этот вывод, манипулируя приведенным выше регулярным выражением

1 Ответ

1 голос
/ 18 марта 2019

Требуется небольшое изменение, чтобы получить желаемый результат. По вашему,

my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien', 'Expedien N0']

Вы указали Expedien перед Expedien N0, из-за чего в text Expedien N0 18-00232995 текст Expedien совпадает, а N0 совпадает во второй группе и не оставляет возможности для сопоставления Expedien N0, как это происходит позже. Следовательно, если вы просто измените порядок в своем списке и поместите Expedien N0 перед Expedien, тогда Expedien N0 соответствует первой группе, а 18-00232995 попадет во вторую группу и даст вам желаемые результаты. Проверьте ваш модифицированный код Python ниже,

import re
s="""text Expedien N0 18-00232995
$cat input_file
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"""
my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien N0', 'Expedien']

rx = r'(?<!\w)({})\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)'.format('|'.join(map(re.escape,my_list)))
print(rx)
print(re.findall(rx, s))

печать

[('Expedien N0', '18-00232995'), ('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('tramite', '1234567'), ('Expedien N°', '18-00777'), ('Expedien N°', '18-0022995')]
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ You have your intended tuple here in your findall results
...