Regex не извлекает правильное значение сзади - PullRequest
1 голос
/ 07 ноября 2019

Для строки = "4/3/09" с использованием

df['dates'] = df['dates'].str.replace(r'([/ ]\d\d)\b', r'19\g<0>')
#or
df['dates'] = df['dates'].str.replace(r'([/ ]\d\d)$', r'19\g<0>')

Я получаю 4/319/09, но я должен получить 4/3/1909

Мои данные:

date_set = ['04/20/2009', '04/20/09', '4/20/09', '4/3/09',
'Mar-20-2009', 'Mar 20, 2009', 'March 20, 2009', 'Mar. 20, 2009', 
'Mar 20 2009','20 Mar 2009', '20 March 2009', '20 Mar. 2009', 
'20 March, 2009','Mar 20th, 2009', 'Mar 21st, 2009', 'Mar 22nd, 2009',
'Feb 2009', 'Sep 2009', 'Oct 2010',
'6/2008', '12/2009',
'2009', '2010']

Если есть двухзначный год, мне нужно добавить 1900. Например, если год равен 09, его следует заменить на 1909

1 Ответ

1 голос
/ 07 ноября 2019

Шаблон ([/ ]\d\d)\b соответствует / или пробелу, а затем 2 цифры до границы слова, а str.replace заменяет совпадение (здесь /09) на 19 + все совпадение, в результате чего 4/3 + 19/09 => 4/319/09.

Вам необходимо использовать

df['dates'] = df['dates'].str.replace(r'([/ ])(\d\d)\b', r'\g<1>19\2')

См. Демонстрационную версию regex

Здесь,

  • ([/ ]) - Группа захвата 1: a / или пробел
  • (\d\d) - Группа захвата 2: две цифры
  • \b - граница слова

Замена - r'\g<1>19\2, т. Е. Группа 1 (здесь используется однозначная обратная ссылка на группу 1, поскольку следующий символ в шаблоне замены представляет собой цифру, см. python re.sub group: число после \ number ) + 19 и значение группы 2 (здесь \2 - это обычная числовая обратная ссылка, так как за шаблоном нет ничего).

См. re.sub Документация Python .

РЕДАКТИРОВАТЬ

После того, как вы добавили больше данных, кажется, что вам нужно совпадать только с двумя цифрами в конце tСтрока.

Use

df['dates'] = df['dates'].str.replace(r'([/ ])(\d\d)$', r'\g<1>19\2')
df['dates'] = df['dates'].str.replace(r'(?<=[/ ])(?=\d\d$)', '19')

Вторая строка удаляет проблему с обратными ссылками, так как она использует обходные пути.

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