str.split 正则表达式(复杂模式)

str.split by regex (complex pattern)

如何在下面的数据框中使用正则表达式将 ID 从注释中分离出来?

df=pd.DataFrame({"header":["SS50377_28860 All-trans-retinol 13,14-reductase"]})

所以列应该是这样的:

df_new=pd.DataFrame({"id":"SS50377_28860","header":["All-trans-retinol 13,14-reductase"]})

以下代码无法正常运行。

df.join(df["header"].str.split(r'\d+', 0, expand=True))

提前致谢!!

您可以在数字和字母之间用一个或多个空格分隔:

df[['id','header']] = df['header'].str.split(r'(?<=\d)\s+(?=[A-Z])', n=1, expand=True)

或者,您可以将 ID 模式捕获到一组中,其余的捕获到另一组中:

df[['id', 'header']] = df['header'].str.extract(r'^([A-Z0-9]+_[A-Z0-9]+)\s+(.*)', expand=True)

或者,您可以简单地 Series.str.split 使用第一个空白块:

df[['id', 'header']] = df['header'].str.split("\s+", n=1, expand=True)

输出:

>>> df
                              header             id
0  All-trans-retinol 13,14-reductase  SS50377_28860

详情:

  • (?<=\d)\s+(?=[A-Z]) - 匹配一个或多个空格 (\s+),这些空格紧跟一个数字 ((?<=\d)) 并紧跟一个大写 ASCII 字母 ([A-Z])
  • ^([A-Z0-9]+_[A-Z0-9]+)\s+(.*) - 匹配字符串的开头 (^),然后捕获一个或多个大写 ASCII 字母或数字,_ 并再次捕获一个或多个大写 ASCII 字母或数字到第 1 组(列“id”)然后匹配一个或多个空格(\s+),然后将其余行捕获到第 2 组(使用 (.*))。

无论您选择哪种解决方案,都取决于您输入的多样性以及您希望在此处应用多少验证。