Python 使用多个组提取正则表达式
我试图从一系列字符串中提取一个数字。例如,考虑这一系列:Python 使用多个组提取正则表达式,python,regex,pandas,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 = 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
但是,因为我在正则表达式中有三个组,所以我有三列,下面是一个问题:
我是否可以编写一个包含一个组或可以生成一个列的正则表达式,或者我是否需要将这些列合并为一个列,如果需要,我如何在没有循环的情况下实现这一点
期望的结果将是一个系列,如:
0 1
1 2
2 5
3 9
4 3
5 7
最简单的方法是
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
0
0 1
1 2
2 5
3 9
4 3
5 7
另一种方法是使用可选的非捕获组:
s.str.extract('(?:a-b-)?(?:c1-d-)?(?:e-10-f-[0-9]-)?([0-9])')
输出:
0 1
1 2
2 5
3 9
4 3
5 7
Name: 0, dtype: object
0
0 1
1 2
2 5
3 9
4 3
5 7
最简单的方法是
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
0
0 1
1 2
2 5
3 9
4 3
5 7
另一种方法是使用可选的非捕获组:
s.str.extract('(?:a-b-)?(?:c1-d-)?(?:e-10-f-[0-9]-)?([0-9])')
输出:
0 1
1 2
2 5
3 9
4 3
5 7
Name: 0, dtype: object
0
0 1
1 2
2 5
3 9
4 3
5 7
您可以在末尾使用单个捕获组,并在捕获组中添加3个前缀
(?:
由于它们都以连字符结尾,您可以将其移动到非捕获组之后,使其短接一点
(?:a-b|c1-d|e-10-f-[0-9])-([0-9])
输出
您可以在末尾使用单个捕获组,并在捕获组中添加3个前缀
(?:
由于它们都以连字符结尾,您可以将其移动到非捕获组之后,使其短接一点
(?:a-b|c1-d|e-10-f-[0-9])-([0-9])
输出
是的,这就是我在寻找的答案,如果你愿意的话,把它作为一个答案。谢谢!你的意思是想把这些选项转换成
(?:a-b | c1-d | e-10-f-[0-9])-((?:a-b | c1-d | e-10-f-[0-9])-([0-9])谢谢!