Regex: захват имени и отдела отдельно - PullRequest
2 голосов
/ 21 октября 2019

С учетом текстовых строк, таких как

Assigned to: Hon Keith Davis Dept: S25
Assigned for All Purposes to: Hon. Howard Halm, Dept. 93
Judge Randolph M. Hammock Dept. 93
HONORABLE JOANNE B. O'DONNELL
Honorable Michael S. Williams
Judge:            Hon. Yolanda Orozco

Я хочу запоминать имя судьи и его отдел, если таковой имеется.

Это то, что я придумалдо сих пор захватывает только имя:

(?i)(?:(?:Hon(?:orable)?|Judge)(?:[:\. ]+))+((?-i)[A-Z][A-Za-z. '-]{3,})

Проблема в том, что для 1-й и 3-й строк захватывается часть Dept, поэтому я получаю Keith Davis Dept и Randolph M. Hammock Dept

Когда я попытался добавить вторую группу захвата, добавив

[, ]+(?:(?:Dept)[\.: ]+([A-Z0-9]+))?

к приведенному выше регулярному выражению, это сработало для первых 2 строк, но не для остальных.

Как можноЯ исключаю Dept из 1-й группы захвата и использую 2-ю группу захвата, чтобы получить название / номер отдела?

Текущее регулярное выражение и примеры: https://regexr.com/4n85p

Ответы [ 2 ]

3 голосов
/ 21 октября 2019

Вы можете использовать

(?i)(?:(?:Hon(?:orable)?|Judge)[:. ]+)+((?-i)[A-Z][A-Za-z. '-]{3,})(?:[, ]+Dept[.: ]+([A-Z0-9]+))?$

См. Демоверсию regex

Подробности

  • (?i)- чувствительность к регистру отключена
  • (?:(?:Hon(?:orable)?|Judge)[:. ]+)+ - 1+ случаев Hon или Honorable или Judge, за которыми следуют 1+ двоеточий, точек, пробелов
  • ((?-i)[A-Z][A-Za-z. '-]{3,}) - группа 1:
    • (?-i) - чувствительность к регистру
    • [A-Z] - заглавная буква
    • [A-Za-z. '-]{3,} - 3 или более букв ASCII, точек, пробелов, апострофов или дефисов
  • (?:[, ]+Dept[.: ]+([A-Z0-9]+))? - необязательная группа без захвата, соответствующая 1 или 0 вхождениям:
    • [, ]+ - 1+ запятых или пробелов
    • Dept - буквенный текст
    • [.: ]+ - 1+ точек, двоеточий или пробелов
    • ([A-Z0-9]+) - Группа 2: 1+ заглавные буквы или цифры
  • $ - конец строки.

Дополнительные советы:

  • Если вы хотите начать сопоставление только с целыми словами, добавьте \bпосле (?i)
  • Для соответствия любому пробелу замените буквенные пробелы на \s (или \h - если supported - для соответствия только горизонтальным пробелам).
0 голосов
/ 21 октября 2019
.*(?:(?:H[Oo][nN](?:[oO][a-zA-Z]+(?:[^.])?)?)|(?:Judge:?))\.?\s*([a-zA-Z .']+),?\s*(?:Dept[:.]\s*([a-zA-Z0-9]+))?\n

Пожалуйста, попробуйте вышеуказанное выражение в вашей ссылке

.*(?:(?:H[Oo][nN](?:[oO][a-zA-Z]+(?:[^.])?)?)|(?:Judge:?))\.?\s*(?<judge_name>[a-zA-Z .']+),?\s*(?:Dept[:.]\s*(?<department>[a-zA-Z0-9]+))?\n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...