如何在Python中使用正则表达式匹配整个目标字符串?
解决方案
原代码存在两个核心问题:
- 循环中每次用
crime = re.findall(...)覆盖变量,最终只保留最后一次匹配结果,无法收集所有目标条目 - 正则
[A-Z].*过于宽泛,会匹配所有以大写字母开头的字符串(比如"Pacific"、"IC"),不符合需求
针对你要匹配的两类目标字符串,我们可以编写更精准的正则,并调整收集结果的逻辑:
目标字符串特征与对应正则
- 犯罪类型:全大写,包含空格、连字符、括号、数字、$符号,例如
"THEFT FROM MOTOR VEHICLE - GRAND ($950.01 AND OVER)"
正则:^[A-Z\s\-()$0-9.]+$(确保整个字符串都是允许的字符,且无小写字母) - 地点字符串:以数字开头,后续是大写字母和空格(允许多个连续空格),例如
"5600 N FIGUEROA ST"
正则:^\d+\s+[A-Z\s]+$
修正后的代码
import re hello = {"meta": 1, "reza": [[ "row-f696.af3d.c3v9", "00000000-0000-0000-2D2F-EA38F9F11DB9", 0, 1642111191, 1642111191, "{ }", "201412343", "2020-06-15T00:00:00", "2020-06-15T00:00:00", "0700", "14", "Pacific", "1494", "1", "331", "THEFT FROM MOTOR VEHICLE - GRAND ($950.01 AND OVER)", "1606 0344 1300 1402", "60", "F", "W", "212", "TRANSPORTATION FACILITY (AIRPORT)", "IC", "Invest Cont", "331", "998", "400 WORLD WY", "33.9433", "-118.4072" ] , [ "row-f2wh.yte2-zhv8", "00000000-0000-0000-0BF4-2A6281C66DEF", 0, 1636553859, 1636553859, "{ }", "201107194", "2020-03-11T00:00:00", "2020-03-11T00:00:00", "1100", "11", "Northeast", "1118", "1", "510", "VEHICLE - STOLEN", "0", "108", "PARKING LOT", "IC", "Invest Cont", "510", "5600 N FIGUEROA ST", "34.114", "-118.1949" ]]} crime = [] # 预编译正则,提升效率 crime_pattern = re.compile(r'^[A-Z\s\-()$0-9.]+$') location_pattern = re.compile(r'^\d+\s+[A-Z\s]+$') for items in hello["reza"]: for item in items: # 先确保item是字符串类型 if isinstance(item, str): # 匹配犯罪类型,排除过短的无效匹配(比如"IC"、"F") if crime_pattern.match(item) and len(item) > 3: crime.append(item) # 匹配地点 elif location_pattern.match(item): crime.append(item) print(crime)
代码说明
- 预编译正则:提前编译正则表达式,避免循环中重复编译,提升性能
- 类型判断:先判断
item是否为字符串,避免对数字等非字符串类型进行匹配 - 过滤短字符串:针对犯罪类型,排除长度过短的匹配(比如"IC"、"F"),确保只保留有效条目
- 结果收集:用
append将符合条件的条目添加到列表,而不是覆盖变量
运行后输出的结果会包含所有你需要的目标字符串:
['THEFT FROM MOTOR VEHICLE - GRAND ($950.01 AND OVER)', 'TRANSPORTATION FACILITY (AIRPORT)', '400 WORLD WY', 'VEHICLE - STOLEN', '5600 N FIGUEROA ST']
内容的提问来源于stack exchange,提问作者AshRoss
相关产品推荐
相关产品推荐

