使用正则表达式转换手机联系人名单
Jul 5th
今天换了手机,第一件要紧事就是恢复联系人名单。旧手机是HTC c720W,新手机是Nokia 5320XM,其联系人名单格式不一。难道要我一条条输入吗?阿弥陀佛,几百组联系人的信息,手动操作会死人的。
我看了一下以前备份的HTC c720W联系人名单,(说到这里,表扬一下自己:勤于备份真是好习惯,万一某天灾难降临,你还有个指望),发现其格式是这样的:
-
-2147483070
0
SomeBody
1355***9214
***
1899-12-30 00:00:00
1899-12-30 00:00:00
-
...
而诺基亚的通讯录格式是这样的:
"名称","名","中间名","姓","后缀","职务","公司","生日","SIP 地址","一键通","共享视图","用户 ID","备忘","常用手机","常用电话","常用电子邮件","常用传真","常用视频电话","常用网址","常用 VOIP 地址","常用邮政信箱","常用分机","常用街道","常用邮政编码","常用城市","常用省/市/自治区","常用国家/地址","家庭手机","住宅电话","家庭电子邮件","住宅传真","家庭视频电话","家庭网址","家庭 VOIP 地址","家庭邮政信箱","家庭分机","家庭街道","家庭邮政编码","家庭城市","家庭省/市/自治区","家庭国家/地区","公司手机","公司电话","公司电子邮件","公司传真","公司视频电话","公司网址","公司 VOIP 地址","公司邮政信箱","公司分机","公司街道","公司邮政编码","公司城市","公司省/市/自治区","公司国家/地区",""
本想偷懒,去找个xml2csv什么的,不过不太好用。还是请“正则表达式”这个老朋友帮忙吧!
分析xml文件,发现只有
mobiletelephonenumber,businesstelephonenumber,hometelephonenumber,firstname,lastname这5个字段是有用的;对应的csv字段名称是:
“名”,”姓”,”常用手机”,”常用电话”,”公司电话”
其余的字段大可放心删除。
祭出RegexBuddy,写了这样一条正则表达式:
1 2 3 4 5 6 7 8 9 10 | result = re.sub( r"""(?smx)(?#"名","姓","常用手机","常用电话","公司电话") ^\s*<item>.*? <mobiletelephonenumber/?>(?P<mobile>[^\s<]*).*? <businesstelephonenumber/?>(?P<business>[^\s<]*).*? <hometelephonenumber/?>(?P<home>[^\s<]*).*? <firstname/?>(?P<first>[^\s<]*).*? <lastname/?>(?P<lastname>[^\s<]*).*? </item>""", r'"\g<first>","\g<lastname>","\g<mobile>","\g<home>","\g<business>"', subject) |
之所以使用python格式来写正则,是因为它支持命名捕获,看起人直观一些。其实整个替换过程是在RegexBuddy中进行的。
替换后,保存为CSV文件,使用诺基亚自带的软件导入,几百个联系人就又重新归位了。大爽。

Comments