Найти все группы из 9 цифр (\ d {9}) до определенного слова - PullRequest
0 голосов
/ 17 января 2020

У меня есть следующая строка, извлеченная из файла PDF, и я хотел бы получить из него номер «класса управления» из девяти цифр:

string = ‘(some text before)Process ID: JD7717PO CONTROL CLASS706345519,708393673, 706855190 CODE AAZ-1585 ZZF-8017. Sector: Name:MULTIBANK S.A. SAAT:  54177846900115Date of Production2019/12/20\x02.02.037SBPEAA201874249B\x0c(some text after)’

Я хочу, чтобы все совпадения встречались перед словом « Сектор », иначе у меня будут нежелательные матчи. Я использую модуль «re», в Python 3.8.

Я пытался использовать отрицательный вид сзади следующим образом:

(?<!Sector:)\d{9})

Однако это не сработало. У меня все еще были совпадения типа «54177846» и «201874249», которые идут после слова «Сектор».

Я также пытался «изолировать» область поиска между словами «Идентификатор процесса» и «Сектор» :

(Process ID:.*?)(\d{9})(.*Sector)

Я также пытался найти выражение \ d9 только до слова «Сектор», но оно не дало результатов.

Я должен был найти решение в два этапа: (1) я создал регулярное выражение, которое бы находило все результаты вплоть до слова «Сектор» (desperate_regex = ‘(.*)Sector)’ and assigned it to a new variable,partal_text`; (2) я тогда выполнил поиск требуемого регулярного выражения ('\ d {9}') в новой переменной.

Мой код работает, но не удовлетворяет меня. Как мне найти свои совпадения с помощью одного поиска регулярных выражений? обратите внимание, что первый номер «класса управления» усекается с текстом, который стоит перед ним («CONTROL CLASS706345519»).

(PS: я совершенно новичок ie, и это мой первый пост Я надеюсь, что смогу объяснить себя. Спасибо!)

Ответы [ 4 ]

2 голосов
/ 17 января 2020

Самый простой способ - получить строку перед Sector и просто найти ее:

split_string, _ = string.split("Sector")
nums = re.findall(r'\d{9}', split_string)
# ['706345519', '708393673', '706855190']

Другой вариант - использовать сторонний модуль regex , который позволяет перекрывать совпадения:

import regex as re
nums = re.findall(r'(\d{9}).*?Sector', string, overlapped=True)
# ['706345519', '708393673', '706855190']
1 голос
/ 18 января 2020

Вы можете использовать чередование и разрыв, если найдете «Сектор»:

import re
text = """(some text before)Process ID: JD7717PO CONTROL CLASS706345519,708393673, 706855190 CODE AAZ-1585 ZZF-8017. Sector: Name:MULTIBANK S.A. SAAT:  54177846900115Date of Production2019/12/20\x02.02.037SBPEAA201874249B\x0c(some text after)"""
rx = re.compile(r'\d{9}|(Sector)')

results = []
for match in rx.finditer(text):
    if match.group(1):
        break
    results.append(match.group(0))

print(results)

Что дает

['706345519', '708393673', '706855190']
1 голос
/ 18 января 2020

Регулярное выражение, описанное ниже, может быть более излишним, чем требуется для реального обрабатываемого случая, но лучше, чем потом сожалеть.

Если вы хотите сопоставить строку из 9 цифр, не больше, не меньше, тогда вы если вы отрицательно относитесь к утверждениям «смотреть назад» и «смотреть вперед», чтобы убедиться, что за 9 цифрами не предшествует и не следует другой ди git (опять же, в этом случае, возможно, ОП знает, что только 9-ди git числа когда-либо появятся, и это перебор ). Вы также можете использовать отрицательное утверждение, чтобы убедиться, что Sector не появляется перед 9 цифрами. Это более позднее утверждение является утверждением переменной длины, для которого требуется пакет regex от PyPI:

r'(?<!Sector.*?)(?<!\d)\d{9}(?!\d)'
  1. (?<!Sector.*? Подтвердите, что мы не сканировали прошлое Sector. Это обрабатывает ситуацию, когда Sector может появляться несколько раз на входе, гарантируя, что мы никогда не сканируем после первого вхождения.
  2. (?<!\d) Утверждаем, что предыдущий символ не является ди git.
  3. \d{9} Совпадение 9 цифр.
  4. (?!\d) Утверждение, что следующий символ не является ди git.

Упрощенная версия:

r'(?<!Sector.*?)\d{9}'

код:

import regex as re

string = '(some text before)Process ID: JD7717PO CONTROL CLASS706345519,708393673, 706855190 CODE AAZ-1585 ZZF-8017. Sector: Name:MULTIBANK S.A. SAAT:  54177846900115Date of Production2019/12/20\x02.02.037SBPEAA201874249B\x0c(some text after)'

#print(re.findall(r'(?<!Sector.*?)\d{9}', string))
print(re.findall(r'(?<!Sector.*?)(?<!\d)\d{9}(?!\d)', string))

отпечатки:

['706345519', '708393673', '706855190']
0 голосов
/ 17 января 2020

Если к любой из этих работ я добавлю объяснение:

[\s\S]+(?:Process ID:\s+)(.*)(?:\s+Sector)[\s\S]+

\g<1>

Или это?

(?i)[\s\S]+(?:control\s+class\s*)(\d{9})[\s\S]+

\g<1>

...