如何在Python中使用正则表达式提取字符及DataFrame中的位置与财年?
嘿,这两个正则相关的问题我来帮你搞定!
问题1:Python里用正则提取大写字母及字母数字字符
提取这类字符核心是用Python的re模块,搭配精准的正则模式就行,分几种场景给你示例:
场景1:提取所有单个大写字母,以及任意字母(大小写)+数字组成的连续序列
比如从混合字符串里把大写字母、字母数字片段都揪出来:
import re text = "Hello WORLD_123 TestABC456 xyz789" matches = re.findall(r'[A-Z]|[A-Za-z0-9]+', text) print(matches) # 输出: ['H', 'ello', 'WORLD', '123', 'TestABC456', 'xyz789']
[A-Z]:匹配单个大写字母[A-Za-z0-9]+:匹配一个或多个字母(大小写)/数字的连续片段
场景2:只提取大写字母,以及大写字母+数字的组合
如果你只想要纯大写字母或者大写字母加数字的内容:
matches = re.findall(r'[A-Z]+[0-9]*|[0-9]+[A-Z]*', text) print(matches) # 输出: ['H', 'WORLD', '123', 'ABC456']
场景3:严格提取同时包含字母和数字的序列(必须两者都有)
用正向预查来确保片段里既有字母又有数字:
matches = re.findall(r'(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]+', text) print(matches) # 输出: ['123', 'TestABC456', 'xyz789']
问题2:从DataFrame的文件名列提取位置和财年
完全可以用正则搞定!先看你的示例数据,财年有两种格式:FY+2/4位数字(比如FY19、FY2020)和FiscalYear+4位数字(FiscalYear2020);位置则是财年前面的那个单词,刚好可以利用这个规律来写正则。
先构造示例DataFrame:
import pandas as pd import re df = pd.DataFrame({ 'Filename': [ 'KATH FY19 nepal', 'Nepal BIRATNA FY2020', 'India DEL FY18', 'HQ chennai FiscalYear2020' ] })
然后用str.extract()一次性提取两个列,正则模式直接匹配财年前面的单词和财年本身:
# 正则里的两个分组分别对应Location和FiscalYear pattern = r'.*?(\w+)\s+(FY\d{2,4}|FiscalYear\d{4})' df[['Location', 'FiscalYear']] = df['Filename'].str.extract(pattern)
运行后你就能得到预期的结果:
| Filename | Location | FiscalYear |
|---|---|---|
| KATH FY19 nepal | KATH | FY19 |
| Nepal BIRATNA FY2020 | BIRATNA | FY2020 |
| India DEL FY18 | DEL | FY18 |
| HQ chennai FiscalYear2020 | chennai | FiscalYear2020 |
正则模式解释:
.*?:非贪婪匹配任意字符,避免过度匹配到无关内容(\w+):捕获位置,匹配财年前面的完整单词\s+:匹配单词和财年之间的空格(FY\d{2,4}|FiscalYear\d{4}):捕获财年,覆盖两种财年格式(FY后跟2-4位数字,或者FiscalYear后跟4位数字)
如果你的数据还有其他特殊情况,比如位置不是财年前一个单词,可以再调整正则,但目前这个模式完全适配你的示例~
内容的提问来源于stack exchange,提问作者gannu




