正则表达式解析(三)
正则片段如下:
text = re.sub(r"\s+", " ", text)
text = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9\s,.!?;:,。?!;:]", " ", text)
这两行代码都使用 Python 的 re.sub()
函数,用于对字符串进行正则表达式匹配和替换。
1. text = re.sub(r"\s+", " ", text)
- 含义:这行代码将字符串
text
中所有连续的空白字符(如空格、制表符、换行符等)替换为一个单个空格。 - 详细解释:
- 正则表达式
r"\s+"
:\s
是一个元字符,表示匹配任何空白字符,包括空格 (\t
)、换行符 (\n
)、回车符 (\r
)、垂直制表符 (\v
) 和换页符 (\f
) 。+
是一个量词,表示匹配前面的元素(即\s
)一次或多次。因此,\s+
匹配一个或多个连续的空白字符 。- 例如,在字符串
"Hello world\n"
中,\s+
会匹配" "
(三个空格)和"\n"
(换行符)。
- 替换操作:
re.sub()
函数将匹配到的所有连续空白字符替换为单个空格" "
。- 例如,输入
"Hello world\n"
会被替换为"Hello world "
(注意换行符也被替换为空格)。
- 目的:这用于规范化文本中的空白,减少多余的空白字符,使文本更整洁。这在数据清洗中很常见,例如去除多余空格或换行符 。
- 正则表达式
2. text = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9\s,.!?;:,。?!;:]", " ", text)
- 含义:这行代码将字符串
text
中所有不属于指定字符集(包括中文字符、英文字母、数字、空白字符及常见中英文标点)的字符替换为一个空格。 - 详细解释:
- 正则表达式
r"[^\u4e00-\u9fa5a-zA-Z0-9\s,.!?;:,。?!;:]"
:[]
定义一个字符类,用于匹配方括号内的任何字符。^
在字符类开头表示“否定”,即匹配 不 在指定集合中的任何字符 。- 指定字符集包括:
\u4e00-\u9fa5
:Unicode 范围,匹配所有中文字符(从 U+4E00 到 U+9FA5)。a-zA-Z
:匹配所有英文字母(大小写)。0-9
:匹配所有数字。\s
:匹配任何空白字符(同上)。,.!?;:
:匹配英文常见标点符号(逗号、句号、感叹号、问号、分号、冒号)。,。?!;:
:匹配中文常见标点符号(中文逗号、句号、感叹号、问号、分号、冒号)。
- 因此,整个正则表达式匹配任何 不 属于上述字符集的字符。例如,符号如
@
、#
、$
、&
或非中英文字符(如日文)都会被匹配。
- 替换操作:
re.su b()
将匹配到的所有非法字符替换为单个空格" "
。- 例如,输入
"Hello@世界!123"
会被替换为"Hello 世界!123"
(@
被替换为空格)。
- 目的:这用于文本清洗,移除或替换掉不想要的字符(如特殊符号、表情符号、其他语言字符),只保留中英文文本、数字、空白和基本标点。常见于自然语言处理(NLP)的预处理,确保输入数据标准化 。
- 正则表达式
整体效果和注意事项
-
整体效果:这两行代码组合使用,先规范化空白字符(第一行),再移除非法字符(第二行)。最终输出是一个“干净”的字符串,只包含中文字符、英文字母、数字、空白和指定标点,多余字符被空格替代。例如:
- 输入:
"Hello 世界!@123\n"
(含多余空格、换行符和符号)。 - 第一行后:
"Hello 世界!@123 "
(连续空白和换行符被压缩)。 - 第二行后:
"Hello 世界! 123 "
(@
被替换为空格)。
- 输入:
-
注意事项:
- 证据中,
re.sub()
的count
参数默认为 0,表示替换所有匹配项;如果需限制替换次数,可指定count
值 。 - 第二行的字符集设计可能不完整(如缺少某些标点),但覆盖了常见需求。Unicode 范围
\u4e00-\u9fa5
是标准中文范围,但可能不包括所有罕见汉字 。
- 证据中,
-
应用场景:常用于文本预处理,如搜索引擎、聊天机器人或数据分析,确保输入文本标准化,提高后续处理(如分词或情感分析)的准确性 。