|
1 | 1 | import re
|
2 |
| -from typing import NamedTuple |
| 2 | +from typing import NamedTuple, Optional |
3 | 3 |
|
4 | 4 | CHINA_PHONE_PATTERN = re.compile(r"^1[356789]\d{9}$")
|
5 | 5 |
|
6 | 6 |
|
7 | 7 | class Contact(NamedTuple):
|
8 | 8 | name: str
|
9 | 9 | phone: str
|
| 10 | + note: Optional[str] = None |
10 | 11 |
|
11 | 12 |
|
12 |
| -def is_china_phone(phone: str) -> bool: |
13 |
| - return CHINA_PHONE_PATTERN.match(phone) is not None |
| 13 | +def is_china_mobile_phone(phone: str) -> bool: |
| 14 | + return len(phone) == 11 and CHINA_PHONE_PATTERN.match(phone) is not None |
14 | 15 |
|
15 | 16 |
|
16 | 17 | def parse_contact(person_text: str):
|
17 |
| - info_list: list[str] = person_text.rsplit(None, 1) |
18 |
| - if len(info_list) != 2: |
| 18 | + # 修改分割逻辑以支持备注字段 |
| 19 | + parts = person_text.split() |
| 20 | + if len(parts) < 2: |
19 | 21 | raise ValueError(f"The person info is illegal: '{person_text}'.")
|
20 |
| - name, phone = info_list |
21 |
| - if not name: |
22 |
| - raise ValueError(f"The name is illegal: '{name}'.") |
23 |
| - if not is_china_phone(phone): |
24 |
| - raise ValueError(f"The phone number is illegal: '{phone}'.") |
25 |
| - return Contact(name, phone) |
| 22 | + |
| 23 | + for i, part in enumerate(parts): |
| 24 | + if is_china_mobile_phone(part): |
| 25 | + phone = part |
| 26 | + name = " ".join(parts[:i]) |
| 27 | + note_parts = parts[i + 1:] |
| 28 | + note = " ".join(note_parts) if note_parts else None |
| 29 | + break |
| 30 | + else: |
| 31 | + raise ValueError(f"The person info is illegal: '{person_text}'.") |
| 32 | + |
| 33 | + return Contact(name, phone, note) |
0 commit comments