Python正则表达式匹配至多1个空格分隔的文本段(需保留位置)
问题:解析
标签表格数据并保留文本段位置
我尝试解析
标签中的表格数据,但难以找到合适的正则表达式模式。我希望顺序匹配所有被至多一个空格分隔的字符序列。
输入:' Not seasonally adjusted Seasonally adjusted (1) Latest'
期望输出:['Not seasonally adjusted', 'Seasonally adjusted (1)', 'Latest']
我尝试过以下正则表达式:
- 负向前瞻表达式
'[\S ]+(?!\s{2,})',匹配结果为整行文本;- 否定表达式
'[^\s{2,}]',匹配文本中的每个非空格字符;- 结合.*与否定的表达式
'.*[^\s{2,}]',匹配结果为整行文本。
注意:我使用Python,但不想使用re.split('\s{2,}')这类方法,因为我不仅需要提取文本,还要保留每个文本段的起止字符位置,以便输入到表格解析/解释脚本中。请问该如何实现?
解决方案
使用正则表达式\S(?:\s?\S)*配合re.finditer()即可实现,该模式的逻辑是:
\S:匹配字段的第一个非空格字符(?:\s?\S)*:匹配任意次数的「可选单个空格 + 非空格字符」组合,确保字段内仅允许单个空格分隔,遇到两个及以上连续空格时自动终止匹配
Python代码示例
import re input_str = ' Not seasonally adjusted Seasonally adjusted (1) Latest' pattern = r'\S(?:\s?\S)*' # 获取所有匹配对象,包含位置信息 matches = list(re.finditer(pattern, input_str)) # 提取文本内容 extracted_text = [match.group() for match in matches] # 提取每个文本段的起止索引 text_positions = [(match.start(), match.end()) for match in matches] print("提取的文本列表:", extracted_text) print("各文本段的起止位置:", text_positions)
运行后会输出你需要的文本列表,同时match.start()和match.end()能直接拿到每个文本段在原字符串中的起始和结束位置,完全满足表格解析时的位置需求。
内容的提问来源于stack exchange,提问作者user3787120
相关产品推荐
相关产品推荐

