У меня есть серия панд
list_df = pd.Series(['KingsDuck',
'RangersIslandersDevils',
'Shark',
'Maple Leafs',
'Red Wing'])
display(list_df)
0 KingsDuck
1 RangersIslandersDevils
2 Shark
3 Maple Leafs
4 Red Wing
dtype: object
и я хотел бы вставить запятую между нижним символом и верхним символом. (Например: «KingsDuck» на «Kings, Duck» и «RangersIslandersDevils» на «Rangers, Islanders, Devils»)
Я попробовал онлайн-инструменты регулярных выражений Python, чтобы проверить свое регулярное выражение, и оно сработало так, как предполагалось: повторное выражение
Однако, когда я попробовал регулярное выражение в своем блокноте Jupyter, результат оказался не таким, как я ожидал:
list_df.replace(r'(([a-z])([A-Z]))',r'\1,\2', regex=True)
0 KingsD,suck
1 RangersI,sslandersD,sevils
2 Shark
3 Maple Leafs
4 Red Wing
dtype: object
Как мне это сделать?
У вас слишком много групп, удалите внешние скобки. У вас есть ((a)(b))
, поэтому \1
есть ab
, \2
есть a
, \3
есть b
.
list_df.replace(r'([a-z])([A-Z])',
r'\1,\2', regex=True)
Или, если вы действительно хотите сохранить внешнюю группу:
list_df.replace(r'(([a-z])([A-Z]))',
r'\2,\3', regex=True)
Выход:
0 Kings,Duck
1 Rangers,Islanders,Devils
2 Shark
3 Maple Leafs
4 Red Wing
dtype: object
@Jon, в этом случае ты даже можешь обойти все ссылки: list_df.replace(r'(?<=[a-z])(?=[A-Z])', r',', regex=True)
;)
В качестве альтернативы - это также выполнимо, используя взгляд позади:
list_df.replace(r'(?<=[a-z])([A-Z])', r',\1', regex=True)
(что кажется мне немного более явным в отношении намерения).