98 lines
1.6 KiB
Python
98 lines
1.6 KiB
Python
|
import re
|
|||
|
|
|||
|
from ...attrs import LIKE_NUM
|
|||
|
|
|||
|
_single_num_words = [
|
|||
|
"〇",
|
|||
|
"一",
|
|||
|
"二",
|
|||
|
"三",
|
|||
|
"四",
|
|||
|
"五",
|
|||
|
"六",
|
|||
|
"七",
|
|||
|
"八",
|
|||
|
"九",
|
|||
|
"十",
|
|||
|
"十一",
|
|||
|
"十二",
|
|||
|
"十三",
|
|||
|
"十四",
|
|||
|
"十五",
|
|||
|
"十六",
|
|||
|
"十七",
|
|||
|
"十八",
|
|||
|
"十九",
|
|||
|
"廿",
|
|||
|
"卅",
|
|||
|
"卌",
|
|||
|
"皕",
|
|||
|
"零",
|
|||
|
"壹",
|
|||
|
"贰",
|
|||
|
"叁",
|
|||
|
"肆",
|
|||
|
"伍",
|
|||
|
"陆",
|
|||
|
"柒",
|
|||
|
"捌",
|
|||
|
"玖",
|
|||
|
"拾",
|
|||
|
"拾壹",
|
|||
|
"拾贰",
|
|||
|
"拾叁",
|
|||
|
"拾肆",
|
|||
|
"拾伍",
|
|||
|
"拾陆",
|
|||
|
"拾柒",
|
|||
|
"拾捌",
|
|||
|
"拾玖",
|
|||
|
]
|
|||
|
|
|||
|
_count_num_words = [
|
|||
|
"一",
|
|||
|
"二",
|
|||
|
"三",
|
|||
|
"四",
|
|||
|
"五",
|
|||
|
"六",
|
|||
|
"七",
|
|||
|
"八",
|
|||
|
"九",
|
|||
|
"壹",
|
|||
|
"贰",
|
|||
|
"叁",
|
|||
|
"肆",
|
|||
|
"伍",
|
|||
|
"陆",
|
|||
|
"柒",
|
|||
|
"捌",
|
|||
|
"玖",
|
|||
|
]
|
|||
|
|
|||
|
_base_num_words = ["十", "百", "千", "万", "亿", "兆", "拾", "佰", "仟"]
|
|||
|
|
|||
|
|
|||
|
def like_num(text):
|
|||
|
if text.startswith(("+", "-", "±", "~")):
|
|||
|
text = text[1:]
|
|||
|
text = text.replace(",", "").replace(".", "").replace(",", "").replace("。", "")
|
|||
|
if text.isdigit():
|
|||
|
return True
|
|||
|
if text.count("/") == 1:
|
|||
|
num, denom = text.split("/")
|
|||
|
if num.isdigit() and denom.isdigit():
|
|||
|
return True
|
|||
|
if text in _single_num_words:
|
|||
|
return True
|
|||
|
# fmt: off
|
|||
|
if re.match('^((' + '|'.join(_count_num_words) + '){1}'
|
|||
|
+ '(' + '|'.join(_base_num_words) + '){1})+'
|
|||
|
+ '(' + '|'.join(_count_num_words) + ')?$', text):
|
|||
|
return True
|
|||
|
# fmt: on
|
|||
|
return False
|
|||
|
|
|||
|
|
|||
|
LEX_ATTRS = {LIKE_NUM: like_num}
|