Удалите все, что не соответствует шаблонам регулярных выражений в Python - PullRequest
0 голосов
/ 28 марта 2019

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

Пример материала, который я хочу удалить:

Mexico [12/20/1985] Если бы я мог удалить то, что не соответствует шаблону, скобки и Мексика исчезли бы

Скажимой шаблон регулярного выражения (у меня есть еще два, которые соответствуют более конкретным форматам даты, но не включая их, потому что это не относится к делу:

pattern = (r"(19|20)\d\d")

Я использую has_date = data.str.contains(pattern), и это работаетидеально, чтобы найти то, что я ищу. Но теперь, когда я определил наблюдения, в которых есть даты, которые я хочу, мне нужно убрать / удалить / заменить ничто все, что не соответствует этой схеме.

Я сделал файл того, что не соответствовало шаблонам регулярных выражений, и что сделал, и проверил, чтобы убедиться, что мои шаблоны регулярных выражений получили все, поэтому у меня все хорошо.

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

1 Ответ

1 голос
/ 01 апреля 2019

Для решения вашей конкретной проблемы, а именно замены всего, что не соответствует шаблону, вы можете использовать

df['Data'] = df['Data'].str.replace(r"(?s)((?:19|20)\d\d)?.", r"\1")

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

Здесь (?s) сделает . совпадением с любым символом, ((?:19|20)\d\d)? - необязательная группа захвата # 1, которая соответствует либо 19 или 20, а затем любые 2 цифры 1 или 0 раз, а затем совпадения любой символ с . рисунком. Если группа 1 соответствует, она будет возвращена в результат из-за обратной ссылки \1.

Однако кажется, что вы хотите просто извлечь год из данных, а если их нет, просто получить пустую строку, поэтому используйте

df['Data'] = df['Data'].str.extract(r'\b((?:19|20)\d{2})\b', expand=False).fillna('')

\b((?:19|20)\d{2})\b будет соответствовать 19 или 20, а затем любым двум цифрам как целому слову (из-за \b границ слова).

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