Python中如何基于姓名正则表达式将指定字符串分割为列表
原正则失效原因
原正则无法生效的核心问题有三个:
- 人名部分匹配规则过于死板,仅支持「数字+两个英文单词」的格式,无法适配多单词人名场景
- 未开启单行匹配模式,
.元字符默认无法匹配换行符,仅能在单行内匹配内容,无法跨多行匹配完整条目 - 未覆盖字符串末尾边界,最后一个条目没有后续的序号触发匹配,无法被捕获
正确实现方案
匹配正则
^\d+ .*?(?=\n{2,}\d+ |\Z)
规则说明:
^\d+:匹配行首的序号(数字+空格)作为每个条目的起始标志.*?:非贪婪匹配所有内容(?=\n{2,}\d+ |\Z):正向预查,匹配到「两个以上换行+下一个序号」或者「字符串结尾」就停止匹配,不会消耗匹配内容,不影响下一个条目的捕获
配套Python代码示例
需要同时开启 re.DOTALL(让 . 匹配换行符)和 re.MULTILINE(让 ^ 匹配每一行的行首)标志:
import re string = '''1 Acone Raffaele ^Eboli (SA) - 04/12/1971^ 148/A Dottore commercialista^ 84043 Agropoli (SA) - Via P. Mascagni, 5 ^CNARFL71T04D390R^ A - Commercialisti^ Laurea in Economia e Commercio (64/S) ^Agropoli (SA) Ordine Tel. 0974824169 - Fax 0974824169 Esercente ^06/05/2002^06/05/2002^ Email: raffaeleacone@tiscali.it ^06/05/2002^Revisore legale - n. 125741^PEC: raffaele.acone@pec.commercialisti.it 2 Agresta sdfsdf dfdsf ^Salerno (SA) - 08/09/1979 269/A Dottore commercialista^ 84043 Agropoli (SA) - Via F. Angrisani, 7 ^GRSDNL79P08H703B^ A - Commercialisti^ Laurea in Economia e Commercio (64/S) ^Agropoli (SA)Tel. 0974 823625 - Fax 0974 823625^ Esercente ^25/07/2012^25/07/2012^ Email: d.agresta@yahoo.it ^25/07/2012^Revisore legale - n. 165766^PEC: d.agresta@pec.it 3 Agresta Veronica ^Vallo della Lucania (SA) - 06/10/1981 281/A Dottore commercialista^ 84052 Ceraso (SA) - Via Campo, 1 ^GRSVNC81R46L628Z^ A - Commercialisti^ Laurea in Economia e Commercio (LM-56) ^Ceraso (SA)^Tel. 0974 61248^Esercente ^24/01/2014^24/01/2014^ Email: veronica.ag@live.it ^24/01/2014^Revisore legale - n. 172086^PEC: veronicaagresta@pec.it ''' # 直接获取条目列表 result = re.findall(r'^\d+ .*?(?=\n{2,}\d+ |\Z)', string, flags=re.DOTALL | re.MULTILINE) # 如果需要每个元素单独包裹列表,执行以下转换即可 # result = [[item.strip()] for item in result] print(result)
运行后输出结果和需求完全一致。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

