如何在Pandas中使用正则表达式提取指定字段后的作者名?
用正则表达式提取Pandas列中的作者名
嘿,我来帮你搞定这个正则提取的问题~你之前用split的方法可行,但正则其实更灵活,能适配更多格式变化的情况。
首先,你之前尝试的df.str.extract("first author:(.*?)")没成功,大概率是因为.*?是非贪婪匹配,它会匹配尽可能少的字符,在没有明确终止标记的情况下,可能只匹配到空字符串或者很短的内容。咱们调整一下正则表达式就能解决:
正确的正则写法
你需要匹配first author:之后的所有内容直到字符串结尾,结合你的文本格式,用下面的代码就可以:
# 假设你的目标列名为'EntrezUID',和你之前用的一致 df['author_name'] = df['EntrezUID'].str.extract(r'first author:\s*(.*)$')
代码细节解释
r'first author:\s*(.*)$':r表示原始字符串,避免转义字符的干扰;first author:精确匹配固定前缀;\s*匹配0个或多个空格(适配冒号后可能有空格的情况,比如first author: REAGAN RL);(.*)捕获所有后续字符(贪婪匹配,会一直取到字符串末尾);$匹配字符串结尾,确保我们取到的是first author:之后的全部内容。
示例验证
假设你的数据框是这样的:
import pandas as pd data = { 'EntrezUID': [ 'create date:1953/01/01 | first author:REAGAN RL', 'create date:2000/05/10 | first author:SMITH JD', 'first author:WILSON AE' # 极端情况:只有作者信息 ] } df = pd.DataFrame(data) # 提取作者名 df['author_name'] = df['EntrezUID'].str.extract(r'first author:\s*(.*)$') print(df)
输出结果会是:
EntrezUID author_name 0 create date:1953/01/01 | first author:REAGAN RL REAGAN RL 1 create date:2000/05/10 | first author:SMITH JD SMITH JD 2 first author:WILSON AE WILSON AE
进阶适配:如果作者名后还有其他内容
如果你的文本格式偶尔会出现first author:XXX | other info:YYY这种情况,只需要把正则调整为:
df['author_name'] = df['EntrezUID'].str.extract(r'first author:\s*(.*?)\s*\|')
这里的.*?非贪婪匹配会在遇到下一个|时停止,精准提取作者名。
内容的提问来源于stack exchange,提问作者Harsha Vardhan
相关产品推荐
相关产品推荐

