Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多个组提取正则表达式_Python_Regex_Pandas - Fatal编程技术网

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])谢谢!