如何使用正则表达式仅匹配<>标签内的空白字符并替换为下划线
正则实现方案
实现思路
要精准达成需求,首先要划清处理边界:
- 只处理被
<和>包裹的标签片段范围内的空白 - 标签外的正文文本(比如示例里 Moscow and Miami 这类内容)完全不参与匹配替换,从根源上避免误伤
- 标签范围内的空白统一替换为下划线,示例里的闭标签本身没有内部空格,不会出现误改
具体规则写法
通用环视匹配版
适配大多数现代正则引擎(Python、Java、最新版JS、Go等),匹配正则为:(?<=<[^<>]*)\s(?=[^<>]*>)
规则拆解:
(?<=<[^<>]*):后置环视,确认当前匹配的空白,往前追溯最近的尖括号是<,说明空白在标签内部起始位置之后\s:匹配单个空白,如果要把连续多个空白合并成一个下划线,可以把该段替换为\s+(?=[^<>]*>):前置环视,确认当前匹配的空白,往后追溯最近的尖括号是>,说明空白还没到标签的结束位置
这个规则匹配到的所有空白,都严格处于标签内部,把匹配到的内容直接替换为_,就能得到目标效果:<ENAMEX_TYPE="GPE">Moscow and Miami</ENAMEX> are good, but <ENAMEX_TYPE="GPE">New York is better</ENAMEX>
标签正文里的所有空格,因为往前找最近的尖括号是>,不符合后置环视的条件,完全不会被匹配改动。
高兼容捕获分组版
如果碰到不支持变长后置环视的老旧正则引擎,就用整标签捕获的写法,兼容性更好:
- 用正则
<[^>]+>把所有标签块整体匹配出来 - 对每个匹配到的标签块,把块内部的空白全部替换为下划线
- 和未改动的正文拼接得到最终结果
Python环境下的实际运行代码示例:
import re source_str = '<ENAMEX TYPE="GPE">Moscow and Miami</ENAMEX> are good, but <ENAMEX TYPE="GPE">New York is better</ENAMEX>' # 匹配所有标签块,逐块处理内部空白 final_str = re.sub( r'<[^>]+>', lambda m: m.group().replace(' ', '_'), source_str ) print(final_str)
运行输出结果和上面的环视版本完全一致。
适用说明
这个方案默认标签内部没有嵌套尖括号,和题目给出的示例场景完全匹配;如果标签内容本身包含尖括号结构,只需要调整标签块的匹配范围规则即可适配。
内容的提问来源于stack exchange,提问作者Dalireeza
相关产品推荐
相关产品推荐

