????个人主页:https://blog.****.net/2401_86688088?type=blog
???? 系列专栏:https://blog.****.net/2401_86688088/category_12797772.html
目录
前言
一、匹配中文
(一)匹配单个中文字符
(二)匹配多个连续的中文字符
(三)匹配中英文混合的文本中的中文字符
(四)匹配中文标点符号
(五)匹配中文字符和标点符号
(六)匹配所有 CJK (中文、日文、韩文) 字符
(七)匹配不包括中文的部分
(八)匹配中文总结
二、贪婪与非贪婪模式
(一)贪婪模式
(二)非贪婪模式
(三)贪婪与非贪婪小结
三、总结
前言
正则表达式是一种强大的工具,可以帮助我们在文本处理中灵活高效地匹配、查找、替换各种字符和字符串模式。对于中文字符的处理,正则表达式尤其有用,因为它可以通过 Unicode 范围直接匹配常用的汉字及标点符号。此外,正则表达式中的贪婪和非贪婪模式提供了不同的匹配策略,使我们能够更灵活地控制匹配的长度和范围。这篇文章将通过一些示例介绍如何使用正则表达式匹配中文字符,以及如何利用贪婪和非贪婪模式进行不同方式的匹配。
一、匹配中文
正则表达式可以用来匹配各种字符,包括中文字符。匹配中文字符的核心是利用 Unicode 字符集中的中文范围。在正则表达式中,中文字符的匹配一般使用字符范围 [\u4e00-\u9fa5]
,其中 \u4e00
到 \u9fa5
是 Unicode 中常见中文字符的范围。
(一)匹配单个中文字符
要匹配单个中文字符,可以使用 [\u4e00-\u9fa5]
,它表示匹配一个中文字符。
示例:
import re
text = "这是一个测试"
# 匹配单个中文字符
result = re.findall(r'[\u4e00-\u9fa5]', text)
print(result) # 输出: ['这', '是', '一', '个', '测', '试']
(二)匹配多个连续的中文字符
如果你想匹配多个连续的中文字符,可以使用 [\u4e00-\u9fa5]+
,它表示匹配一个或多个连续的中文字符。
示例:
import re
text = "这是一个测试"
# 匹配多个连续的中文字符
result = re.findall(r'[\u4e00-\u9fa5]+', text)
print(result) # 输出: ['这是一个测试']
(三)匹配中英文混合的文本中的中文字符
在处理包含中英文混合的文本时,可以用正则表达式只提取中文字符。
示例:
import re
text = "This is a test. 这是一个测试。"
# 匹配所有中文字符
result = re.findall(r'[\u4e00-\u9fa5]+', text)
print(result) # 输出: ['这是一个测试']
(四)匹配中文标点符号
除了汉字,中文标点符号也有专门的 Unicode 范围。要匹配中文标点符号,可以使用 [\u3000-\u303F]
这个范围。
示例:
import re
text = "你好,世界!这是一个测试。"
# 匹配中文标点符号
result = re.findall(r'[\u3000-\u303F]', text)
print(result) # 输出: [',', '!', '。']
(五)匹配中文字符和标点符号
如果要同时匹配中文字符和中文标点,可以将这两部分结合在一起。例如,使用 [\u4e00-\u9fa5\u3000-\u303F]+
来匹配。
示例:
import re
text = "你好,世界!这是一个测试。"
# 匹配中文字符和中文标点
result = re.findall(r'[\u4e00-\u9fa5\u3000-\u303F]+', text)
print(result) # 输出: ['你好', ',', '世界', '!', '这是一个测试', '。']
(六)匹配所有 CJK (中文、日文、韩文) 字符
如果要匹配所有 CJK(中日韩)字符,可以使用 Unicode 字符集中的范围 [\u4e00-\u9FFF]
。
示例:
import re
text = "中文, 한국어, 日本語"
# 匹配所有 CJK 字符
result = re.findall(r'[\u4e00-\u9FFF]+', text)
print(result) # 输出: ['中文', '한국어', '日本語']
(七)匹配不包括中文的部分
可以使用反向匹配来排除中文部分。例如,匹配非中文字符的部分,可以使用 [^ \u4e00-\u9fa5]+
。
示例:
import re
text = "这是1234一个测试test。"
# 匹配非中文的字符
result = re.findall(r'[^ \u4e00-\u9fa5]+', text)
print(result) # 输出: ['1234', 'test']
(八)匹配中文总结
正则表达式通过 Unicode 范围可以轻松匹配中文字符。使用 [\u4e00-\u9fa5]
匹配常用汉字字符,同时可以通过调整范围和组合来匹配标点符号、CJK 字符以及中英文混合的内容。通过合理使用这些技巧,你可以在文本处理和解析过程中高效地提取和操作中文字符。
二、贪婪与非贪婪模式
在 Python 中,正则表达式的贪婪和非贪婪模式控制了匹配时字符的数量:
(一)贪婪模式
贪婪模式会尽可能多地匹配字符,直到整个表达式不再匹配为止。默认情况下,Python 正则表达式是贪婪的,即量词(如 *
、+
、{m,n}
)会尝试匹配尽可能多的字符。
常见的贪婪量词:
-
*
:匹配前面的字符 0 次或多次 -
+
:匹配前面的字符 1 次或多次 -
{m,n}
:匹配前面的字符至少 m 次,至多 n 次
示例:
import re
text = "abc123abc456"
result = re.search(r'a.*c', text)
print(result.group()) # 输出:abc123abc
在上面的示例中,.*
是贪婪匹配,会尽可能多地匹配字符,直到最后一个 c
,因此匹配了 "abc123abc"。
(二)非贪婪模式
非贪婪模式,也称为惰性匹配,会尽可能少地匹配字符。你可以在贪婪量词后加上一个 ?
来实现非贪婪匹配。例如:*?
、+?
、{m,n}?
。
非贪婪量词:
-
*?
:匹配前面的字符 0 次或多次,但尽可能少地匹配 -
+?
:匹配前面的字符 1 次或多次,但尽可能少地匹配 -
{m,n}?
:匹配前面的字符至少 m 次,至多 n 次,但尽可能少地匹配
示例:
import re
text = "abc123abc456"
result = re.search(r'a.*?c', text)
print(result.group()) # 输出:abc
在上面的示例中,.*?
是非贪婪匹配,它会尽可能少地匹配字符,所以它匹配了 "abc"(第一个 a
到第一个 c
之间的内容)。
(三)贪婪与非贪婪小结
-
贪婪模式:默认模式,会尽可能多地匹配字符。
-
非贪婪模式:通过
?
将贪婪量词转换为非贪婪,会尽可能少地匹配字符。 -
常见的用法是通过在量词后添加
?
,如*?
或+?
来启用非贪婪模式。
三、总结
通过本文的介绍,我们可以看到正则表达式在处理中文字符时的强大能力。从匹配单个或多个汉字,到捕获中英文混合文本中的中文部分,再到提取特定的中文标点符号,正则表达式都能轻松应对。同时,掌握贪婪和非贪婪模式的差异可以帮助我们在匹配字符时更加精准。在文本解析和数据清理任务中,熟练运用这些正则表达式技巧将为我们带来极大的便利和效率。