如何编写正则表达式提取编号后的姓名并避免误匹配?
提取带编号序列的姓名正则方案
给定待处理字符串:
"1. Sachin Deshpande 2. K. Chandra Shekar 3. B. Rupesh 1. Prabhakar Rao 2. Venkata Chary 3. B. Gangadhar"
之前使用的正则(?:[0-9][).])+(\D*)存在误匹配问题,比如会错误提取raj sharma 4) mirror ship中4)后的内容。可以使用以下更精准的正则表达式解决:
(?<!\S)\d[.)]\s*(.*?)(?=\s*(?:\d[.)]|$))
正则各部分说明
(?<!\S):负向零宽断言,确保编号(数字+.或))的前面没有非空白字符,保证编号是列表项的起始(要么在字符串开头,要么前面是空格),避免匹配嵌入在文本中间的编号。\d[.)]:匹配列表项的编号格式(数字后接.或))。\s*:匹配编号与姓名之间的任意空白字符。(.*?):非贪婪模式匹配姓名内容,避免过度匹配到后续的列表项。(?=\s*(?:\d[.)]|$)):正向零宽断言,匹配到下一个列表项编号(前置任意空白)或字符串结尾时停止,确保每个姓名只提取到当前项的结尾。
示例代码(Python)
import re input_str = "1. Sachin Deshpande 2. K. Chandra Shekar 3. B. Rupesh 1. Prabhakar Rao 2. Venkata Chary 3. B. Gangadhar" name_pattern = r'(?<!\S)\d[.)]\s*(.*?)(?=\s*(?:\d[.)]|$))' name_list = re.findall(name_pattern, input_str) print(name_list)
输出结果
["Sachin Deshpande","K. Chandra Shekar","B. Rupesh","Prabhakar Rao","Venkata Chary","B. Gangadhar"]
这个正则只会提取以标准编号格式开头的列表项姓名,不会误匹配嵌入在文本中间的编号内容。
内容的提问来源于stack exchange,提问作者supernova
相关产品推荐
相关产品推荐

