这里,才 python 前沿。可惜是英文原版。所以,我要练习英文阅读。
—— 华罗庚
不练不知道,一炼“嘿一跳”
看似简单的问题,也是有“难点”的。这个“小练笔”,差点儿没搞死我,居然调试了近一小时。
最后才用“零宽断言”和 for 嵌套搞定。
题目来源:
《从给定字符串中提取姓名》
https://blog.csdn.net/weixin_30567471/article/details/98618745
中英文姓名提取代码
通过对包含中英文姓名的字符分析,发现字符串结构中,中文名都在一个半角空格接字母之前,英文名都在一个半角空格前是数字或中文字符。可以用零宽断言:中文名,半角空格和字符(w,不含标点和空格)之前的字符(w);英文名,半角空格和字符(w)之后的字符串。
name_C = re.findall(r"(\w+)(?=\s\w+)", j) # 零宽断言提取前面的中文姓名。
name_E = re.findall(r"(?<=[\w+]\s)(\w+)", j) # 零宽断言提取后面的英文姓名。
运行效果
(如果从语句注释不能清楚作用,请评论区留言指教和探讨。)
#!/sur/bin/env python
# coding: utf-8
'''
filename: /sdcard/qpython/tem.py
梦幻精灵_cq的炼码场
'''
from mypythontools import color, wait, cut_line # 从自码工具模块加载需用代码模块中要使用的函数。
import re
names = ["张敏15 zhangmin15 ()", "杨丹丹 yangdandan (99999)", "钱凤 qianfeng (84567)", "柏宁宁 bainingning (99999), 滕玥3 tengyue3 ()"]
for i in names: # 遍历提取。
for j in i.split(','): # 鉴于最后列表元素是两个英文逗号分隔的名字,for嵌套用','分词。
name_C = re.findall(r"(\w+)(?=\s\w+)", j) # 零宽断言提取前面的中文姓名。
name_E = re.findall(r"(?<=[\w+]\s)(\w+)", j) # 零宽断言提取后面的英文姓名。
print(f"{cut_line()}{'':>2}输入字符串:“{j}”\
{cut_line()}\n\n{'提取姓名:':>12}\
\n\n{'中文:':>18}{name_C[0]}\n\n\
{'英文:':>18}{name_E[0]}\n{cut_line()}")
wait()
上一篇: 个人信息提取(字符串)
下一篇: 骚包的中文字符提取操作(字符串,不用 re ,用 in )
来源:老齐教室