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"

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


person Matthew    schedule 21.08.2018    source источник


Ответы (2)


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

/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
person Matthew    schedule 21.08.2018

Чтобы соответствовать только разделу компании и только в том случае, если перед ним стоит «SUBJECT COMPANY», используйте поиск позади:

(?<=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])))
person Bohemian♦    schedule 21.08.2018