Выражение для цифры плюс два символа, такие как «1-й», «2-й», «10-й», «22-й»? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть набор телефонных звонков, расшифрованных в текст, где каждый образец содержит текст. Я пытаюсь определить все образцы, где указаны даты. Чтобы было ясно, я ищу только образцы, где присутствуют число и два дополнительных символа, например, «1-й», «2-й», «25-й».

Прямо сейчас, у меня есть довольно грубый подход. Он выполняет свою работу, но есть ли более чистый способ добиться того же с помощью регулярных выражений?


def date_mentioned(text):
    date_list = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th', '29th', '30th', '31st']

    for date in date_list:
        if re.search(date, text):
            return True
    return False

Ответы [ 4 ]

1 голос
/ 04 июня 2019

Поскольку вы ищете порядковые номера, правила:

Если число заканчивается на 1 и не равно 11, добавьте 'st'
Если число заканчивается на 2 и не равно 12, добавьте 'nd'
Если число заканчивается на 3 и не равно 13, добавьте «rd»
для всех остальных чисел добавьте 'th'

Регулярное выражение, которое может различать эти случаи:

'^11th|12th|13th|\d*(1st|2nd|3rd|[04-9]th)$'

А приложение:

def date_mentioned(text):
    if re.match('^11th|12th|13th|\d?(1st|2nd|3rd|[04-9]th)$', text):
        return True
    return False

объяснение RegEx
Мы ищем эту последовательность:

^: начало строки
11th: строка 11th
|: или
12th: строка 12th
|: или
13th: строка 13th
|: или
\d?: 0 или 1 цифра (: следуют

1st: строка 1st
|: или
2nd: строка 2nd |: или
3rd: строка 3rd |: или
[04-9]: одно число от 0 до полного диапазона 4-9
th: строка th
): закрытие, за которым следует
$: конец строки

1 голос
/ 04 июня 2019

Для общих чисел \d*(1st|2nd|3rd|[04-9]th) должен делать то, что вы хотите.Вы можете дополнительно ограничить числа для дат, но полная проверка сложна (месяцы, високосные годы и т. Д.), Поэтому я бы рекомендовал просто вслепую анализировать число и затем проверять его позже.

Редактировать: Спасибо за указаниеошибка с 3-м;неподвижная.

1 голос
/ 04 июня 2019

Вы найдете эти даты с:

[0-9]{1,2}(?:st|nd|rd|th)

Пояснение:
1 или 2 цифры,
затем следуют st, nd, rd или th

1 голос
/ 04 июня 2019

Вы можете использовать регулярное выражение для этого.Вы можете попробовать:

r'\d{1,2}(?:st|nd|rd|th)'

См. демо


Подробности

  • \d{1,2}(?:st|nd|rd|th)
    • \d{1,2} соответствует цифре (равно [0-9])
      • {1,2} Квантор - соответствует от 1 до 2 раз
    • Non-группа захвата (?:st|nd|rd|th)
      • 1-й вариант st
        • st соответствует буквам символов st буквально (с учетом регистра)
      • 2-й вариант nd
        • nd соответствует символам nd в буквальном смысле (с учетом регистра)
      • 3-й вариант rd
        • rd соответствует символам lite буквально (с учетом регистра)
      • 4-й вариант th
        • th соответствует буквам (буквенно (чувствительно к регистру))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...