RegEx для извлечения определенных переменных и значений - PullRequest
2 голосов
/ 12 мая 2019

Я использую API Google Vision для извлечения текста (рукописного и компьютерного) из изображений форм заявок. Ответ - длинная строка, подобная следующей.

Строка:

"A. Bank Challan
Bank Branch
ca
ABC muitce
Deposit ID VOSSÁETM-0055
Deposit Date 16 al 19
ate
B. Personal Information: Use CAPITAL letters and leave spaces between words.
Name: MUHAMMAD HANIE
Father's Name: MUHAMMAD Y AQOOB
Computerized NIC No. 44 603-5 284 355-3
D D M m rrrr
Gender: Male Age: (in years) 22 Date of Birth ( 4-08-1999
Domicile (District): Mirpuskhas Contact No. 0333-7078758
(Please do not mention converted No.)
Postal Address: Raheel Book Depo Naukot Taluka jhuddo Disstri mes.
Sindh.
Are You Government Servant: Yes
(If yes, please attach NOC)
No
✓
Religion: Muslim
✓
Non-Muslimo
C. Academic Information:
B
Intermediate/HSSC ENG Mirpuskhas Bise Match
Seience BISEmirpuskhas Match
2016
2014
Matric/SSC"

Весь ответ для меня бесполезен, однако мне нужно разобрать ответ, чтобы получить конкретные поля, такие как Имя, Имя отца, Номер сетевой карты, Пол, Возраст, DoB, Место жительства и Контактный номер.

Я определяю шаблоны для каждого из этих полей, используя библиотеку регулярных выражений (re) в Python. Например:

import re
name ='Name: \w+\s\w+'
fatherName = 'Father\'s Name: \w+\s\w+\s\w+'
age ='Age: \D+\d+'

print(re.search(name,string).group())
print(re.search(fatherName, string).group())
print(re.search(age,string).group())

Выход:

"Name: MUHAMMAD HANIE
Father's Name: MUHAMMAD Y AQOOB
Age: (in years) 22"

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

Как мне решить эту проблему?

1 Ответ

1 голос
/ 12 мая 2019

Это может быть не надежно, однако можно разработать выражение для извлечения трех параметров, которые вы хотите. Этот инструмент может помочь вам сделать это. Возможно, вы захотите иметь выражение с несколькими границами:

(?=[A-Z])((Name:[A-Z-a-z\s]+\n|\s)|(Father\x27s\sName[A-Z-a-z\s\.]+\n|\s)|(Age:\s\(in\syears\)\s[0-9]+))

Возможно, было бы хорошо сосредоточиться на тексте, который вы хотите извлечь.

Дисперсии

  • Возраст: эта переменная проста для извлечения
  • Имя и имя отца. Вы можете проверить, как могут выглядеть значения в этих двух переменных, чтобы добавить их в список символов. Я только что предположил, что, возможно, это будет список символов: [A-Z-a-z\s\.]. Однако вы можете изменить / упростить его по своему усмотрению.

enter image description here

Описательный график RegEx

Эта ссылка поможет вам визуализировать ваши выражения:

enter image description here

Python Test

# -*- coding: UTF-8 -*-
import re

string = """
A. Bank Challan
Bank Branch
ca
ABC muitce
Deposit ID VOSSÁETM-0055
Deposit Date 16 al 19
ate
B. Personal Information: Use CAPITAL letters and leave spaces between words.
Name: MUHAMMAD HANIE
Father's Name: MUHAMMAD Y AQOOB
Computerized NIC No. 44 603-5 284 355-3
D D M m rrrr
Gender: Male Age: (in years) 22 Date of Birth ( 4-08-1999
Domicile (District): Mirpuskhas Contact No. 0333-7078758
(Please do not mention converted No.)
Postal Address: Raheel Book Depo Naukot Taluka jhuddo Disstri mes.
Sindh.
Are You Government Servant: Yes
(If yes, please attach NOC)
No
✓
Religion: Muslim
✓
Non-Muslimo
C. Academic Information:
B
Intermediate/HSSC ENG Mirpuskhas Bise Match
Seience BISEmirpuskhas Match
2016
2014
Matric/SSC"""
expression = r'(?=[A-Z])((Name:[A-Z-a-z\s]+\n|\s)|(Father\x27s\sName[A-Z-a-z\s\.]+\n|\s)|(Age:\s\(in\syears\)\s[0-9]+))'
match = re.search(expression, string)
if match:
    print("YAAAY! \"" + match.group(2) + "\" is a match ??? ")
else: 
    print('? Sorry! No matches!')

выход

YAAAY! "Name: MUHAMMAD HANIE" is a match ???
...