Pandas正则表达式如何匹配多模式提取日期?
解决Pandas中同时提取A6/JT开头字符串的日期部分问题
我明白你的需求——之前能顺利提取A6开头字符串后的8位日期,现在要新增支持JT开头的情况,但用|没成功对吧?这是因为正则表达式的分组逻辑没处理好,我来帮你修正。
第一步:准备测试数据
先把你给出的测试数据转换成DataFrame:
import pandas as pd d = {'var1': 'A620170101', 'var2': 'JT20170102', 'var3': '', 'var4': 'TG20170102'} df = pd.DataFrame.from_dict(d, orient='index', columns=['sba'])
第二步:修正正则表达式
之前的r'A6(.{8})'只能匹配A6前缀,要同时兼容A6和JT,需要把这两个前缀放到非捕获组里,确保两种前缀后面的8位日期都能被捕获:
df['date'] = df['sba'].str.extract(r'(?:A6|JT)(.{8})', expand=False)
(?:A6|JT):非捕获组,匹配A6或JT但不捕获这个前缀本身(.{8}):捕获后面的8位字符(也就是你的日期部分)
第三步:查看结果
运行后DataFrame的输出会是这样:
| sba | date | |
|---|---|---|
| var1 | A620170101 | 20170101 |
| var2 | JT20170102 | 20170102 |
| var3 | NaN | |
| var4 | TG20170102 | NaN |
可以看到:
- 成功提取了
A6和JT开头的日期 - 空字符串和
TG开头的不匹配项返回NaN,符合预期
为什么之前用|没成功?
如果你的写法是r'A6|JT(.{8})',这会被正则引擎解析为:匹配A6(后面没有捕获组)或者匹配JT加上后面的8位。这样A6开头的字符串就只能匹配到A6,无法捕获后面的日期,所以才会失败。把前缀放到同一个组里就能解决这个问题啦!
内容的提问来源于stack exchange,提问作者spitfiredd
相关产品推荐
相关产品推荐

