使用Python匹配中文數(shù)字的方法詳解
引言
在處理中文文本時(shí),經(jīng)常需要識別或提取 中文數(shù)字(如 一、二、三、十、百、千 等)。Python 的正則表達(dá)式(re 模塊)可以高效地完成這一任務(wù)。本文將介紹 如何用 Python 匹配中文數(shù)字,包括 基本匹配、范圍匹配、嚴(yán)格匹配 以及 常見應(yīng)用場景。
1. 什么是中文數(shù)字?
中文數(shù)字包括:
- 基本數(shù)字:
零、一、二、三、四、五、六、七、八、九 - 十進(jìn)制單位:
十、百、千、萬、億 - 組合形式:
十一、二十、一百、一千、一萬等 - 大寫數(shù)字(財(cái)務(wù)常用):
壹、貳、叁、肆、伍、陸、柒、捌、玖
本文主要討論 基本中文數(shù)字(一 到 十)的匹配,但方法可以擴(kuò)展到更復(fù)雜的數(shù)字。
2. 基本匹配:單個(gè)中文數(shù)字
2.1 匹配一到十
使用 [一二三四五六七八九十] 可以匹配單個(gè)中文數(shù)字:
import re text = "一二三、四五六、七八九十" pattern = r'[一二三四五六七八九十]' matches = re.findall(pattern, text) print(matches) # 輸出: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
2.2 匹配零到九
如果只需要 零 到 九(不包括 十):
pattern = r'[零一二三四五六七八九]' matches = re.findall(pattern, "零一二三四五六七八九") print(matches) # 輸出: ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
3. 范圍匹配:一到十的多個(gè)數(shù)字
3.1 匹配1~3個(gè)中文數(shù)字
使用 {1,3} 限定匹配 1~3 個(gè) 中文數(shù)字:
text = "一二三、四五六、七八九十、十一"
pattern = r'[一二三四五六七八九十]{1,3}'
matches = re.findall(pattern, text)
print(matches) # 輸出: ['一二三', '四五六', '七八九', '十', '十一']
問題:十一 被拆分成 十 和 一(因?yàn)?{1,3} 是貪婪匹配)。
3.2 嚴(yán)格匹配1~3個(gè)連續(xù)中文數(shù)字
如果希望 十一 被視為一個(gè)整體,可以:
pattern = r'(?:[一二三四五六七八九]|十[一二三四五六七八九]?){1,3}'
matches = re.findall(pattern, "一二三、四五六、七八九十、十一")
print(matches) # 輸出: ['一二三', '四五六', '七八九十', '十一']
解釋:
[一二三四五六七八九]→ 匹配一到九十[一二三四五六七八九]?→ 匹配十或十一到十九(?:...)→ 非捕獲分組(僅匹配,不提取){1,3}→ 匹配 1~3 次
4. 嚴(yán)格匹配:一到九十九
4.1 匹配1~99的中文數(shù)字
中文數(shù)字 1~99 的規(guī)則:
1~9→一到九10~19→十到十九20~99→二十到九十九(但二十不能寫成二二十)
正則表達(dá)式:
pattern = r'^([一二三四五六七八九]|十[一二三四五六七八九]?|二十|三十|四十|五十|六十|七十|八十|九十)$'
優(yōu)化版(更簡潔):
pattern = r'^([一二三四五六七八九]|十[一二三四五六七八九]?|[二三四五六七八九十]十)$' matches = re.findall(pattern, ["一", "十", "十一", "二十", "九十九", "一百"]) print(matches) # 輸出: ['一', '十', '十一', '二十', '九十九']
問題:一百 不匹配(因?yàn)槌龇秶?/p>
4.2 更通用的1~99匹配
pattern = r'^([一二三四五六七八九]|十[一二三四五六七八九]?|[二三四五六七八九十]十|[二三四五六七八九十][一二三四五六七八九])$' matches = re.findall(pattern, ["一", "十", "十一", "二十", "二十一", "九十九", "一百"]) print(matches) # 輸出: ['一', '十', '十一', '二十', '二十一', '九十九']
解釋:
[一二三四五六七八九]→1~9十[一二三四五六七八九]?→10~19[二三四五六七八九十]十→20~90(如二十、三十)[二三四五六七八九十][一二三四五六七八九]→21~99(如二十一、九十九)
5. 匹配中文數(shù)字 + 標(biāo)點(diǎn)符號
5.1 匹配一、二.三等
常見場景:章節(jié)標(biāo)題、編號(如 一、 二. 三 )。
text = "一、引言 二.背景 三 方法" pattern = r'([一二三四五六七八九十]+)[、. ]' matches = re.findall(pattern, text) print(matches) # 輸出: ['一', '二', '三']
優(yōu)化版(匹配整個(gè)編號 + 標(biāo)點(diǎn)):
pattern = r'([一二三四五六七八九十]+)[、. ]'
for match in re.finditer(pattern, text):
print(f"數(shù)字: {match.group(1)}, 標(biāo)點(diǎn): {match.group(2)}")
輸出:
數(shù)字: 一, 標(biāo)點(diǎn): 、 數(shù)字: 二, 標(biāo)點(diǎn): . 數(shù)字: 三, 標(biāo)點(diǎn):
5.2 嚴(yán)格匹配一、十.二十一
text = "一、 十. 二十一 二十二、 九十九. 一百" pattern = r'([一二三四五六七八九]|十[一二三四五六七八九]?|[二三四五六七八九十][一二三四五六七八九]?)[、. ]' matches = re.findall(pattern, text) print(matches) # 輸出: ['一', '十', '二十一', '二十二', '九十九']
6. 完整代碼示例
6.1 匹配1~99的中文數(shù)字
import re
def match_chinese_numbers(text):
pattern = r'([一二三四五六七八九]|十[一二三四五六七八九]?|[二三四五六七八九十]十|[二三四五六七八九十][一二三四五六七八九])'
matches = re.findall(pattern, text)
return matches
text = "一 十 十一 二十 二十一 九十九 一百"
print(match_chinese_numbers(text)) # 輸出: ['一', '十', '十一', '二十', '二十一', '九十九']
6.2 匹配中文數(shù)字 + 標(biāo)點(diǎn)符號
def match_chinese_numbers_with_punctuation(text):
pattern = r'([一二三四五六七八九十]+)[、. ]'
matches = []
for match in re.finditer(pattern, text):
matches.append((match.group(1), match.group(2)))
return matches
text = "一、引言 十.背景 二十一 方法"
print(match_chinese_numbers_with_punctuation(text))
# 輸出: [('一', '、'), ('十', '.'), ('二十一', ' ')]
7. 總結(jié)
| 需求 | 正則表達(dá)式 | 示例匹配 |
|---|---|---|
匹配 一 到 十 | [一二三四五六七八九十] | 一, 二, 十 |
匹配 1~3 個(gè)中文數(shù)字 | [一二三四五六七八九十]{1,3} | 一二三, 十 |
匹配 1~99 的中文數(shù)字 | `([一二三四五六七八九] | 十[一二三四五六七八九]? |
匹配 一、 十. 二十一 | ([一二三四五六七八九十]+)[、. ] | 一、, 十., 二十一 |
關(guān)鍵點(diǎn)
- 基本匹配:
[一二三四五六七八九十]匹配單個(gè)數(shù)字。 - 范圍匹配:
{1,3}限定匹配 1~3 個(gè)數(shù)字。 - 嚴(yán)格匹配:使用
十[一二三四五六七八九]?匹配10~19。 - 標(biāo)點(diǎn)符號匹配:
[、. ]匹配、、.或空格。
8. 擴(kuò)展應(yīng)用
- 中文數(shù)字轉(zhuǎn)阿拉伯?dāng)?shù)字(如
"二十三"→23) - 提取中文金額(如
"壹佰貳拾叁元"→123) - 自然語言處理(NLP) 中的中文數(shù)字識別
以上就是使用Python匹配中文數(shù)字的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python匹配中文數(shù)字的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何使用pytorch實(shí)現(xiàn)LocallyConnected1D
由于LocallyConnected1D是Keras中的函數(shù),為了用pytorch實(shí)現(xiàn)LocallyConnected1D并在960×33的數(shù)據(jù)集上進(jìn)行訓(xùn)練和驗(yàn)證,本文分步驟給大家介紹如何使用pytorch實(shí)現(xiàn)LocallyConnected1D,感興趣的朋友一起看看吧2023-09-09
Python現(xiàn)代項(xiàng)目開發(fā)之uv安裝配置與最佳實(shí)踐指南
uv?是由?Astral?公司開發(fā)的?Rust?編寫的?Python?工具鏈,核心優(yōu)勢是極速,功能全面,下面小編就和大家詳細(xì)介紹一下uv安裝配置與最佳實(shí)踐2026-03-03
Python+pandas計(jì)算數(shù)據(jù)相關(guān)系數(shù)的實(shí)例
今天小編就為大家分享一篇Python+pandas計(jì)算數(shù)據(jù)相關(guān)系數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
python按行讀取文件,去掉每行的換行符\n的實(shí)例
下面小編就為大家分享一篇python按行讀取文件,去掉每行的換行符\n的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

