#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/O6XEDS2. Отлично, я думаю, мы почти на месте. Есть ли способ избежать возврата
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. Это выглядит великолепно. Большое вам спасибо!