<p>几乎不可能在所有情况下区分姓名和地址(是姓名还是地址?)。最好的方法是假设名称总是出现在地址之前,否则您将面临各种复杂的查找。在</p>
<p>我会逐行处理数据,首先将行转换为如下列表:</p>
<pre><code>>>> row = "9123456780 \t John Dude \t City of Address \t July 19, 1980 \t M"
>>> row = [entry.strip() for entry in row.split("\t")]
>>> row
['9123456780', 'John Dude', 'City of Address', 'July 19, 1980', 'M']
</code></pre>
<p>现在我要定义一组函数来决定每个条目代表什么。确定MSISDN编号、性别和日期应该相对简单。在</p>
<p>要确定行中的某个条目是否是10位的MSISDN编号:</p>
^{pr2}$
<p>要确定行中的条目是否表示性别:</p>
<pre><code>def is_gender(entry):
if entry in ("m", "f", "M", "F"):
return True
</code></pre>
<p>要确定行中的条目是否代表日期:</p>
<pre><code>from dateutil.parser import parse
def is_date(entry):
try:
parse(entry)
return True
except ValueError:
return False
</code></pre>
<p>现在使用这些函数来构建另一个解析行条目的函数:</p>
<pre><code>def parse_row(row):
s_all = ["<blank>"] * 5
for entry in row:
if is_msisdn(entry):
s_all[0] = entry
elif is_gender(entry):
s_all[4] = entry
elif is_date(entry):
s_all[3] = entry
elif s_all[1] == "<blank>":
s_all[1] = entry
else:
s_all[2] = entry
return " ^ ".join(s_all)
</code></pre>
<p>例如:</p>
<pre><code>>>> row = ['Mira Nova', 'City of Address', 'July 19, 1980']
>>> parse_row(row)
'<blank> ^ Mira Nova ^ City of Address ^ July 19, 1980 ^ <blank>'
>>> row = ['9123456784', 'Mark Mywards', 'City of Address', 'M']
>>> parse_row(row)
'9123456784 ^ Mark Mywards ^ City of Address ^ <blank> ^ M'
</code></pre>