正则表达式对由空格分隔的单词进行分组
我有一个数据框,其中一列是一系列字符串,其中不同的短语是单个单词或由空格分隔的多个单词;每个单词的第一个字母是大写的(例如分别是“Strawberry”或“Strawberry Jam”)。相反,如果不是同一短语的一部分,则单词不会被间隔开(例如“JamApple”)。
df = pd.DataFrame({
'foo': ['Strawberry JamApple', 'BananaPear CrumblePotato', 'Almond Cake'],
'bar': ['A', 'B', 'C'],
'baz': [1, 2, 3],
'zoo': ['x', 'y', 'z'],
})
foo bar baz zoo
0 Strawberry JamApple A 1 x
1 BananaPear CrumblePotato B 2 y
2 Almond Cake C 3 z
我如何使用正则表达式根据上述规则将字符串中的短语分开(分为“草莓酱”、“苹果”、“香蕉”、“梨碎”、“土豆”、“杏仁蛋糕”)。并提取它们?即,获取以下数据框:
foo
0 Strawberry Jam
0 Apple
1 Banana
1 Pear Crumble
1 Potato
2 Almond Cake
我从以下代码开始:
df.loc[:, 'foo'].str.extractall('([A-Z]{1}[a-z]+)').copy()
但是,这将所有单词分开,并且不使用空格来“连接”它们。我将如何包括后者?
谢谢。
回答
Series.str.split + explode
df['foo'].str.split(r'(?<=[a-z])(?=[A-Z])').explode()
0 Strawberry Jam
0 Apple
1 Banana
1 Pear Crumble
1 Potato
2 Almond Cake
Name: foo, dtype: object
正则表达式详细信息:
-
(?<=[a-z]): Positive Lookbehind 匹配范围内的单个字符a到z -
(?=[A-Z]): Positive Lookahead 匹配范围内的单个字符A到Z
见 regex demo
- Great answer!!!