соответствовать нескольким условиям ИЛИ в python 3 регулярных выражений - PullRequest
1 голос
/ 19 февраля 2020

В python 3:

Это список Управления по контролю за иностранными активами, в котором следует контролировать активы отдельных лиц

https://www.treasury.gov/ofac/downloads/sdn.csv

большая часть их данных о рождении (самый последний столбец, разделенный запятыми) похожа на

DOB 23 Jun 1959; alt. DOB 23 Jun 1958

или

DOB 1959; alt. DOB 1958

Я пытаюсь захватить все даты рождения после ключевого слова «DOB» И «alt. DOB» со следующими кодами:

   if len(x.split(';')) > 0:
        if len(re.findall('DOB (.*)', x.split(';')[0])) > 0:
            new = re.findall('DOB | alt. DOB (.*)', x.split(';')[0])[0]
            print(new)

            try:
                print(datetime.strptime(new, '%d %b %Y'))
                return datetime.strptime(new, '%d %b %Y')
            except:
                return None

Но коды получают дату рождения только сразу после «DOB», но не включают дату рождения после «alt. DOB». Интересно, как я могу это сделать? Спасибо.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

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

Шаблон части даты не проверяет саму дату, он делает совпадение более конкретным c.

\bDOB ((?:(?:3[01]|[12][0-9]|0?[1-9]) [A-Za-z]+ )?\d{4})\b

Объяснение

  • \bDOB Совпадение, которому буквально предшествует граница слова
  • ( Группа захвата 1
    • (?: Группа без захвата
      • (?:3[01]|[12][0-9]|0?[1-9]) [A-Za-z]+ Соответствует ди git 1-31 и 1+ символов A-Za-z
    • )? Закрыть группу и сделать ее необязательной
    • \d{4} Совпадение 4 цифр
  • )\b Закрыть группу 1, за которой следует граница слова

Regex demo | Python демо

Например:

import re

regex = r"\bDOB ((?:(?:3[01]|[12][0-9]|0?[1-9]) [A-Za-z]+ )?\d{4})\b"
test_str = ("DOB 23 Jun 1959; alt. DOB 23 Jun 1958\n"
    "DOB 1959; alt. DOB 1958")

print(re.findall(regex, test_str))

Выход

['23 Jun 1959', '23 Jun 1958', '1959', '1958']
1 голос
/ 19 февраля 2020

Вы можете использовать (?<=DOB\s)[\s[a-zA-Z0-9]+]*

   (?<=DOB\s)  = Negative look-behind assertion. This matches string (which is to its right) only if the string preceded by letters DOB followed by a space
   [\s[a-zA-Z0-9]+]* = Match space followed by letters of numbers multiple times

Пример:

items=['DOB 23 Jun 1959; alt. DOB 23 Jun 1958', 'DOB 1959; alt. DOB 1958']
for item in items:
    print(re.findall(r'(?<=DOB\s)[\s[a-zA-Z0-9]+]*',item))

Выход

['23 Jun 1959', '23 Jun 1958']
['1959', '1958']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...