【问题标题】:Regex to group words separated by space正则表达式对以空格分隔的单词进行分组
【发布时间】: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 一样工作

标签: python regex pandas


【解决方案1】:

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

正则表达式详细信息:

  • (?&lt;=[a-z]) : Positive Lookbehind 匹配az 范围内的单个字符

  • (?=[A-Z]) : Positive Lookahead 匹配 AZ 范围内的单个字符

regex demo

【讨论】:

  • 天哪,我的正则表达式不如你的强。积极的向后看。伟大的。我以后会用这个!非常非常棒。 +1
猜你喜欢
  • 2016-09-15
  • 2015-09-10
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多