使用大熊猫提取正则表达式与多个组

时间:2020-05-15 15:27:02

标签: python regex pandas

我正在尝试从熊猫的一系列字符串中提取一个数字。例如,考虑以下系列:

s = pd.Series(['a-b-1', 'a-b-2', 'c1-d-5', 'c1-d-9', 'e-10-f-1-3.xl', 'e-10-f-2-7.s'])

0            a-b-1
1            a-b-2
2           c1-d-5
3           c1-d-9
4    e-10-f-1-3.xl
5     e-10-f-2-7.s
dtype: object

有6行和三个字符串格式/模板(已知)。目的是根据字符串为每行提取一个数字。这是我想出的:

s.str.extract('a-b-([0-9])|c1-d-([0-9])|e-10-f-[0-9]-([0-9])')

这正确地从每一行中提取了我想要的数字:

    0   1   2
0   1   NaN NaN
1   2   NaN NaN
2   NaN 5   NaN
3   NaN 9   NaN
4   NaN NaN 3
5   NaN NaN 7

但是,由于我在正则表达式中有3个组,所以我有3列,下面是问题:

我可以编写一个具有一组或可以生成单个列的正则表达式吗,还是需要将这些列合并为一个正则表达式?如果需要,如何在没有循环的情况下做到这一点?

所需的结果将是以下序列:

0   1
1   2
2   5
3   9
4   3
5   7

2 个答案:

答案 0 :(得分:1)

最简单的方法是bfill\ffill

(s.str.extract('a-b-([0-9])|c1-d-([0-9])|e-10-f-[0-9]-([0-9])')
  .bfill(axis=1)
  [0]
)

输出:

0    1
1    2
2    5
3    9
4    3
5    7
Name: 0, dtype: object

另一种方法是使用可选的非捕获组:

s.str.extract('(?:a-b-)?(?:c1-d-)?(?:e-10-f-[0-9]-)?([0-9])')

输出:

   0
0  1
1  2
2  5
3  9
4  3
5  7

答案 1 :(得分:1)

您可以在最后使用一个捕获组,并在捕获组(?:上添加3个前缀

由于它们都以连字符结尾,因此可以将其移至非捕获组之后以使其短一点。

(?:a-b|c1-d|e-10-f-[0-9])-([0-9])

Regex demo

s.str.extract('(?:a-b|c1-d|e-10-f-[0-9])-([0-9])')

输出

   0
0  1
1  2
2  5
3  9
4  3
5  7