带索引过滤列表:正则匹配导致索引错位的问题排查与解决
解决新冠疫情州级数据提取的索引匹配问题
我来帮你排查并解决这个索引不准确的问题。首先,咱们先分析下你之前代码的问题所在:
你的正则处理里做了两次替换操作(replace('.\n\n', '\n').replace('.', ':')),这会打乱原始文本的结构,比如把汇总行的句号改成冒号,干扰后续的正则匹配;另外,你用的正则^(.*?\(.*?\))\n采用了非贪婪匹配,加上换行符的处理逻辑问题,导致提取到的条目顺序出现偏移,自然索引就不对了。
下面给你两种简单可靠的解决方案,都能保证索引完全符合你的需求:
方案1:字符串分割法(直观易懂)
直接通过拆分换行符来过滤出需要的州数据,逻辑清晰不容易出错:
import re ListA = ['Sehingga 30 Ogos 2021: Jumlah kes COVID-19 yang dilaporkan adalah 19,268 kes (1,725,357 kes).\nPecahan setiap negeri (Kumulatif):\nSelangor - 3,567 (599,624)\nWPKL - 672 (172,236)\nSabah - 2,310 (145,249)\nJohor - 2,265 (136,488)\nSarawak - 2,028 (114,273)\nKedah - 2,084 (97,100)\nNegeri Sembilan - 269 (91,261)\nPulau Pinang - 1,780 (84,759)\nKelantan - 1,308 (76,047)\nPerak - 1,144 (66,889)\nMelaka - 395 (48,141)\nPahang - 788 (43,335)\nTerengganu - 544 (32,884)\nWP Labuan - 2 (9,808)\nWP Putrajaya - 41 (5,373)\nPerlis - 71 (1,890)\nREAD MORE...'] # 取出原始文本并移除末尾的"READ MORE..." raw_content = ListA[0].rstrip('\nREAD MORE...') # 按换行符拆分所有行 all_lines = raw_content.split('\n') # 前两行是汇总标题,从第三行开始就是各州的数据 state_records = all_lines[2:] # 测试索引是否正确 print(state_records[0]) # 输出: Selangor - 3,567 (599,624) print(state_records[2]) # 输出: Sabah - 2,310 (145,249)
方案2:精准正则匹配法
如果偏好正则,可以用更精准的匹配规则,直接定位所有州级数据条目:
import re ListA = ['Sehingga 30 Ogos 2021: Jumlah kes COVID-19 yang dilaporkan adalah 19,268 kes (1,725,357 kes).\nPecahan setiap negeri (Kumulatif):\nSelangor - 3,567 (599,624)\nWPKL - 672 (172,236)\nSabah - 2,310 (145,249)\nJohor - 2,265 (136,488)\nSarawak - 2,028 (114,273)\nKedah - 2,084 (97,100)\nNegeri Sembilan - 269 (91,261)\nPulau Pinang - 1,780 (84,759)\nKelantan - 1,308 (76,047)\nPerak - 1,144 (66,889)\nMelaka - 395 (48,141)\nPahang - 788 (43,335)\nTerengganu - 544 (32,884)\nWP Labuan - 2 (9,808)\nWP Putrajaya - 41 (5,373)\nPerlis - 71 (1,890)\nREAD MORE...'] raw_content = ListA[0] # 正则规则:匹配以州名(含空格和缩写)开头,跟着数字、括号的完整行 state_records = re.findall( r'^[A-Za-z\s]+ - \d+(?:,\d+)* \(\d+(?:,\d+)*\)$', raw_content, flags=re.MULTILINE ) # 验证索引 print(state_records[2]) # 输出: Sabah - 2,310 (145,249)
这两种方案都能保证提取到的列表索引完全符合你的预期,再也不会出现索引偏移的问题啦。
内容的提问来源于stack exchange,提问作者johnny2000
相关产品推荐
相关产品推荐

