Regex захватывает строки A, B или C в любом порядке, только если перед ними не стоит D

У меня есть файл с содержанием примерно так:

SUBJECT COMPANY:    

    COMPANY DATA:   
        COMPANY CONFORMED NAME:         MISCELLANEOUS SUBJECT CORP
        CENTRAL INDEX KEY:          0000000000
        STANDARD INDUSTRIAL CLASSIFICATION:  []
        IRS NUMBER:             123456789
        STATE OF INCORPORATION:         DE
        FISCAL YEAR END:            1231

Затем в файле есть что-то вроде этого:

<REPORTING-OWNER>

COMPANY DATA:   
    COMPANY CONFORMED NAME:         MISCELLANEOUS OWNER CORP
    CENTRAL INDEX KEY:          0101010101
    STANDARD INDUSTRIAL CLASSIFICATION:  []

Что мне нужно сделать, так это записать соответствующее название компании, центральный индексный номер, номер IRS, конец финансового года или все, что я хочу извлечь, но только в разделе соответствующей компании, а не в разделе владельца отчета. Эти строки могут быть в любом порядке или не присутствовать, но я хочу зафиксировать их значения, если они присутствуют.

Регулярное выражение, которое я пытался построить, выглядит так:

(?:COMPANY CONFORMED NAME:\s*(?'conformed_name'(?!(?:A|AN|THE)\b)[A-Z\-\/\\=|&!#$(){}:;,@`. ]+)|CENTRAL INDEX KEY:\s*(?'cik'\d{10})|IRS NUMBER:\s*(?'IRS_number'\w{2}-?\w{7,8})|FISCAL YEAR END:\s*(?'fiscal_year_end'(?:0[1-9]|1[0-2])(?:0[1-9]|[1-2][0-9]|3[0-1])))

Желаемые результаты будут следующими:

conformed_name = "MISCELLANEOUS SUBJECT CORP"
CIK = "000000000"
IRS_number = "123456789"
fiscal_year_end = "1231"

Для этого приемлем любой вкус регулярного выражения, так как я адаптируюсь к тому, что лучше всего подходит для сценария. Спасибо за чтение о моем затруднительном положении и за любые рекомендации, которые вы можете предложить.

2 ответа

Чтобы соответствовать только разделу компании, и только когда ему предшествует "ПРЕДМЕТ КОМПАНИИ", используйте взгляд сзади:

(?<=SUBJECT COMPANY:\t\n     \n     )(?:COMPANY CONFORMED NAME:\s*(?'conformed_name'(?!(?:A|AN|THE)\b)[A-Z\-\/\\=|&!#$(){}:;,@`. ]+)|CENTRAL INDEX KEY:\s*(?'cik'\d{10})|IRS NUMBER:\s*(?'IRS_number'\w{2}-?\w{7,8})|FISCAL YEAR END:\s*(?'fiscal_year_end'(?:0[1-9]|1[0-2])(?:0[1-9]|[1-2][0-9]|3[0-1])))

В итоге я понял это сам. Попробуйте это здесь.

/SUBJECT COMPANY:\s+COMPANY DATA:(?:\s+(?:(?:COMPANY CONFORMED NAME:\s+(?'conformed_name'[^\n]+))|(?:CENTRAL INDEX KEY:\s+(?'CIK'\d{10}))|(?:STANDARD INDUSTRIAL CLASSIFICATION:\s+(?'assigned_SIC'[^\n]+))|(?:IRS NUMBER:\s+?(?'IRS_number'\w{2}-?\w{7,8}))|(?:STATE OF INCORPORATION:\s+(?'state_of_incorporation'\w{2}))|(?:FISCAL YEAR END:\s+(?'fiscal_year_end'(?:0[1-9]|1[0-2])(?:0[1-9]|[1-2][0-9]|3[0-1])))\n))+/s
Другие вопросы по тегам