如何用Python正则表达式从列表中提取括号内代码(解决re.search返回None问题)
原正则失效的原因
你之前使用的re.search('[(A-Z)]')之所以拿不到预期结果,核心是对正则特殊字符的规则理解有偏差:
正则中的方括号[]是字符类定界符,这个模式的实际匹配逻辑是:匹配单个字符,该字符是左括号、或任意大写英文字母、或右括号。这个写法既没有匹配连续两位大写字母的逻辑,也没有关联圆括号的位置,哪怕能匹配到单个字符,也抓不到完整的括号内代码;出现返回None的结果,本质是正则写法和预期完全错位导致的匹配偏差。
可正常运行的实现方案
方案1:修正正则表达式(适配原有正则使用习惯)
调整正则逻辑为「转义匹配普通圆括号,捕获括号内的两位大写字母」,完整可运行示例:
import re states = ['Alabama (AL)', 'Alaska (AK)', 'Arizona (AZ)', 'Arkansas (AR)', 'California (CA)', 'Colorado (CO)', 'Connecticut (CT)', 'Delaware (DE)', 'District of Columbia (DC)', 'Florida (FL)', 'Georgia (GA)', 'Hawaii (HI)', 'Idaho (ID)', 'Illinois (IL)', 'Indiana (IN)', 'Iowa (IA)', 'Kansas (KS)', 'Kentucky (KY)', 'Louisiana (LA)', 'Maine (ME)', 'Maryland (MD)', 'Massachusetts (MA)', 'Michigan (MI)', 'Minnesota (MN)', 'Mississippi (MS)', 'Missouri (MO)', 'Montana (MT)', 'Nebraska (NE)', 'Nevada (NV)', 'New Hampshire (NH)', 'New Jersey (NJ)', 'New Mexico (NM)', 'New York (NY)', 'North Carolina (NC)', 'North Dakota (ND)', 'Ohio (OH)', 'Oklahoma (OK)', 'Oregon (OR)', 'Pennsylvania (PA)', 'Rhode Island (RI)', 'South Carolina (SC)', 'South Dakota (SD)', 'Tennessee (TN)', 'Texas (TX)', 'Utah (UT)', 'Vermont (VT)', 'Virginia (VA)', 'Washington (WA)', 'West Virginia (WV)', 'Wisconsin (WI)', 'Wyoming (WY)'] state_codes = [] for entry in states: # 正则说明:\( 转义匹配左括号;([A-Z]{2}) 捕获2位连续大写字母;\) 转义匹配右括号 res = re.search(r'\(([A-Z]{2})\)', entry) if res: state_codes.append(res.group(1))
注意:正则字符串前一定要加
r前缀,避免反斜杠被Python字符串默认转义吃掉,导致匹配失效。
方案2:无需正则的轻量实现
因为你的源数据格式高度规整,都是「州名 (两位代码)」的固定结构,用字符串切分就能完成提取,效率更高:
state_codes = [ entry.split('(')[1].split(')')[0] for entry in states ]
这个方法的逻辑是:
- 先按左括号
(切分每个字符串,取切分后索引为1的片段(即AL)、AK)这类内容) - 再对该片段按右括号
)切分,取第一段就是纯两位代码,不需要依赖正则库。
内容的提问来源于stack exchange,提问作者Danish Khan
相关产品推荐
相关产品推荐

