Функция для извлечения регистрационного номера компании из текстовой строки с использованием регулярного выражения

#python #regex #match

#python #регулярное выражение #совпадение

Вопрос:

У меня есть функция, которая извлекает регистрационный номер компании (немецкий: handelsregisternummer ) из заданного текста. Хотя мое регулярное выражение для этой конкретной проблемы соответствует правильному формату (см. Демонстрацию), я не могу извлечь правильный регистрационный номер компании.

Я хочу извлечь HRB 142663 B , но получаю HRB 142663 .

Большинство чисел представлены в формате HRB 123456 , но иногда в конце есть буква B .

 import re

def get_handelsregisternummer(string, keyword):

    # https://regex101.com/r/k6AGmq/10
    reg_1 = fr'b{keyword}[,:]?(?:[- ](?:Nr|Nummer)[.:]*)?s?(d (?: d )*)(?: B)?'

    match = re.compile(reg_1)
    handelsregisternummer = match.findall(string)  # list of matched words

    if handelsregisternummer:  # not empty
        return handelsregisternummer[0]
    else:  # no match found
        handelsregisternummer = ""

    return handelsregisternummer
 

Пример текста, извлеченного с веб-сайта. При разрывах строк слова присоединяются друг к другу:

 text_impressum = """"Berlin, HRB 142663 BVAT-ID.: DE283580648Tax Reference Number:"""
 

Применить функцию:

 for keyword in ['HRB', 'HRA', 'HR B', 'HR A']:
    handelsregisternummer = get_handelsregisternummer(text_impressum, keyword=keyword)
    if handelsregisternummer: # if list is not empty anymore, then do...
        handelsregisternummer = keyword   " "   handelsregisternummer
        break
    if not handelsregisternummer:  # if list is empty
        handelsregisternummer = 'not specified'
handelsregisternummer_dict = {'handelsregisternummer':handelsregisternummer}
 

После этого я получаю:

 handelsregisternummer_dict ={'handelsregisternummer': 'HRB 142663'}
 

Но я хочу это:

 handelsregisternummer_dict ={'handelsregisternummer': 'HRB 142663 B'}
 

Комментарии:

1. Что делать, если вы используете группы без захвата только в регулярном выражении ( reg_1 = fr'b{keyword}[,:]?(?:[- ](?:Nr|Nummer)[.:]*)?s?(?:d (?: d )*)(?: B)?' ) и удаляете handelsregisternummer = keyword " " handelsregisternummer строку? См. ideone.com/O6XEDS

2. Отлично, я думаю, мы почти на месте. Есть ли способ избежать возврата Nr или Nummer , соответственно? Эти 2 слова должны быть просто индикатором. Например text_impressum = """"This is an example HRA Nummer 21156""" 'HRA Nummer 21156' , меня интересует возврат HRB . HRA ,… и следующие числа.

Ответ №1:

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

 reg_1 = fr'b({keyword})[,:]?(?:[- ](?:Nr|Nummer)[.:]*)?s?(d (?: d )*(?: B)?)'
#            |_________|                                   |___________________|
 

Затем вам нужно объединить, объединить все группы захвата, сопоставленные и возвращенные с findall :

 if handelsregisternummer: # if list is not empty anymore, then do...
    handelsregisternummer = " ".join(handelsregisternummer)
    break
 

Смотрите демонстрацию Python.

Комментарии:

1. Это выглядит великолепно. Большое вам спасибо!