You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则表达式模式匹配报错及匹配不全问题求助

解决Python正则匹配院校信息的问题

报错原因及修复

你遇到的ValueError: cannot process flags argument with a compiled pattern错误,是因为已经用re.compile()编译了正则模式,就不能再在re.finditer()里传re.VERBOSE标志。正确做法是把标志位传给re.compile():

pattern = re.compile(
    r'(?P<title>.*?)' # 院校名称(非贪婪匹配)
    r'\s+[-–]\s+located\s+in\s+' # 匹配两种破折号及中间的空格
    r'(?P<city>[^,]+)' # 匹配城市(到逗号为止)
    r',\s+' # 逗号分隔符
    r'(?P<state>[^\n•]+)', # 匹配州(到换行或下一个列表项为止)
    re.VERBOSE
)

匹配不全的问题修复

原正则还有几个导致只能匹配1条数据的问题,修正如下:

  • 贪婪匹配问题:原(?P<title>.*)是贪婪匹配,会把后面的内容也吞进去,改成.*?非贪婪匹配,限制匹配到破折号前的内容。
  • 破折号不统一:文本里同时有长破折号–和短破折号-,用[-–]匹配两种符号。
  • 城市含空格:原\w*只能匹配无空格的城市(比如Azusa),但像Aliso Viejo这种带空格的城市需要用[^,]+匹配到逗号前的所有内容。
  • 州的匹配范围:原\w.*会匹配到换行后的内容,改成[^\n•]+只匹配到换行或下一个列表项符号•为止。
  • 列表项前缀:需要匹配每个院校前的• ,在正则开头加上•\s+确保只匹配列表里的院校。

最终可运行代码

import re

# example Wiki data
wiki= """There are several Buddhist universities in the United States. Some of these have existed for decades and are accredited. Others are relatively new and are either in the process of being accredited or else have no formal accreditation. The list includes: 
• Dhammakaya Open University – located in Azusa, California, 
• Dharmakirti College – located in Tucson, Arizona 
• Dharma Realm Buddhist University – located in Ukiah, California 
• Ewam Buddhist Institute – located in Arlee, Montana
• Naropa University - located in Boulder, Colorado 
• Institute of Buddhist Studies – located in Berkeley, California
• Maitripa College – located in Portland, Oregon
• Soka University of America – located in Aliso Viejo, California
• University of the West – located in Rosemead, California 
• Won Institute of Graduate Studies – located in Glenside, Pennsylvania"""

# 修正后的正则模式
pattern = re.compile(
    r'•\s+' # 匹配列表项开头的•和空格
    r'(?P<title>.*?)' # 院校名称,非贪婪匹配到破折号前
    r'\s+[-–]\s+located\s+in\s+' # 匹配破折号及"located in"文本
    r'(?P<city>[^,]+)' # 城市:匹配到逗号前的所有内容(支持含空格)
    r',\s+' # 逗号和空格分隔符
    r'(?P<state>[^\n•]+)', # 州:匹配到换行或下一个•前的内容
    re.VERBOSE
)

# 遍历匹配结果并输出字典
for item in re.finditer(pattern, wiki):
    # 去除州字段末尾的逗号和多余空格
    result = item.groupdict()
    result['state'] = result['state'].strip().rstrip(',')
    print(result)

运行结果

会输出每个院校的名称、城市、州的字典,比如:

{'title': 'Dhammakaya Open University', 'city': 'Azusa', 'state': 'California'}
{'title': 'Dharmakirti College', 'city': 'Tucson', 'state': 'Arizona'}
...

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:05:38