更多正则表达式解决方案?

时间:2017-09-26 15:18:19

标签: regex python-3.x

我想使用sub函数来格式化字符串 “Ross McFluff:0456-45324:155 Elm Street \ nRonald Heathmore:5543-23464:445 Finley Avenue”。

对于每个人,它应该是这样的:

Contact
Name: xx yy
Phone number: 0000-00000
Address: 000 zzz zzz

我试图解决问题:

line = """Ross McFluff: 0456-45324: 155 Elm Street \nRonald Heathmore: 5543-23464: 445 Finley Avenue"""
match = re.sub(r':', r'', line)
rematch = re.sub(r'([A-Z][a-z]+\s[A-Z][a-zA-Z]+)(.*?)(\d\d\d\d-\d\d\d\d\d)', r'Contact. Name: \1. Phone number: \3. Address:\2', match)

我有这样的事情:

"Contact. Name: Ross McFluff. Phone number: 0456-45324. Address:  155 Elm Street \nContact. Name: Ronald Heathmore. Phone number: 5543-23464. Address: 445 Finley Avenue"

我该怎么做才能得到这个结果:

Contact
Name: Ross McFluff
Phone number: 0456-45324
Address: 155 Elm Street
Contact
Name: Ronald Heathmore
Phone number: 5543-23464
Address: 445 Finley Avenue

有什么想法吗?谢谢 /乔治

2 个答案:

答案 0 :(得分:1)

我会像这样折腾:

import re

data = """Ross McFluff: 0456-45324: 155 Elm Street \nRonald Heathmore: 5543-23464: 445 Finley Avenue"""
linelist = data.split("\n")
for theline in linelist:
    rematch = re.sub('([^:]+): ([^:]+): (.*)', r'Contact\nName: \1\nPhone Number: \2\nAddress: \3', theline)
    print (rematch)

结果:

Contact
Name: Ross McFluff
Phone Number: 0456-45324
Address: 155 Elm Street
Contact
Name: Ronald Heathmore
Phone Number: 5543-23464
Address: 445 Finley Avenue

通过这种方式,您可以轻松处理每条"线"。我真的很喜欢使用像:

这样的东西
([^:]+)

这是一个负面的角色类,它不匹配类中的内容,因为那真的是你在做什么。我想你也可以在冒号上做分裂,但是你可能希望通过使用像这样的正则表达式来进行更多的控制。您可能需要使用trim来确保清除所有空格,这实际上取决于您对数据的处理。

如果您需要使用纯正则表达式解决方案,可以通过在这里摆弄来完成:https://regex101.com/

答案 1 :(得分:0)

我倾向于在我可以的时候更喜欢大小说明符,而且我不确定你的第一个响应是如何正确回归的,我假设这只是一个奇怪的异常,但下面是一个应该有效的查询。您的值将为\ 1,\ 3和\ 5用于名称和地址。这应该在读取字符串末尾的地址时起作用。 (我使用通用解析器进行测试)

([A-Z][a-z]+\s[A-Z][a-zA-Z]+)(.*?)(\d{4}-\d{5})(.*?)([\w+ ]+)