如何用Python正则提取DataFrame列中4/5位数字左侧内容?
Pandas提取字符串中首个4/5位数字左侧内容的解决方案
问题场景
现有一个Pandas DataFrame列,包含的字符串格式如下:
column name 0 129 4,029.16 08-31-13 8043 304.12 02-28-13 00T773466 1 19 179.00 03-31-12 T0707440 7794 2,898.56 01-31-13 00T757276 2 19716 3.36 01-31-15 00T729912 30593 6,041.74 12-31-16 00T770362 3 19870 131.22 02-28-15 00T709284 4 30611 199.46 02-03-23 12-31-16 00T691818 4 19984 12.25 02-28-15 00T879664 30647 199.45 12-31-16 00T691818 5 20505 1,206.13 03-31-15 00T590582 30648 199.45 12-31-16 00T691818 6 20623 84.11 04-30-15 00T621725 30759 3,325.27 12-31-16 00T580639
需要提取每个字符串中第一个4或5位数字左侧的所有内容到单独的before列,预期结果如下:
before 0 129 4,029.16 08-31-13 1 19 179.00 03-31-12 T0707440 2 19716 3.36 01-31-15 00T729912 3 19870 131.22 02-28-15 00T709284 4 4 19984 12.25 02-28-15 00T879664 5 20505 1,206.13 03-31-15 00T590582 6 20623 84.11 04-30-15 00T621725
目前已通过以下代码成功提取该数字右侧的内容:
df['after']=df['column_name'].str.extract('(\s\d{4,5}\s+.*)')
解决方案
方法1:使用str.extract配合正则捕获
利用正则的非贪婪匹配,捕获字符串开头到第一个4/5位数字前的所有内容:
df['before'] = df['column_name'].str.extract(r'^(.*?)\s\d{4,5}\s')
- 正则说明:
^:匹配字符串起始位置(.*?):非贪婪模式捕获任意字符,直到遇到后续的匹配规则\s\d{4,5}\s:匹配“空格+4/5位数字+空格”,定位到目标分割点
方法2:使用str.split分割取首段
通过str.split只分割一次,取分割后的第一部分内容:
df['before'] = df['column_name'].str.split(r'\s\d{4,5}\s', n=1).str[0]
- 参数说明:
n=1:限制只分割一次,确保只匹配第一个4/5位数字的位置.str[0]:取分割后的第一个元素,即目标左侧内容
两种方法都能准确得到预期的before列结果。
内容的提问来源于stack exchange,提问作者Nev1111
相关产品推荐
相关产品推荐

