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 组(使用 (.*)
)。
无论您选择哪种解决方案,都取决于您输入的多样性以及您希望在此处应用多少验证。
如何在下面的数据框中使用正则表达式将 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 组(使用(.*)
)。
无论您选择哪种解决方案,都取决于您输入的多样性以及您希望在此处应用多少验证。