【发布时间】:2021-06-14 22:52:57
【问题描述】:
我有一个数据框,其中一列是一系列字符串,其中不同的短语是单个单词或由空格分隔的多个单词;并且每个单词的第一个字母是大写的(例如分别为“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()
但是,这会将所有单词分开,并且不会使用空格来“连接”它们。我将如何包含后者?
谢谢。
【问题讨论】:
-
'([A-Z]{1}[a-z]+)'->r'([A-Z]{1}[a-z]+( [A-Z]{1}[a-z]+)*)'- 一个单词 + 0 个或多个空格 + 单词的东西 regex101.com/r/FrLJfX/1 -
这只有在单元格中最多有 2 个短语时才有效。例如,如果我们用“Strawberry JamApple PieSalmonHamburger”代替“Strawberry JamApple”,它不会提取“Salmon”和“Hamburger”。
-
在 regex101 上为我工作吗? “Strawberry JamApple PieSalmonHamburger”有 4 个匹配项 -> “Strawberry Jam”、“Apple Pie”、“Salmon”、“Hamburger”。我假设 df 的 extractall 像 re.findall 一样工作