限制正则表达式只在两点之间搜索
我想知道如何限制正则表达式搜索文本的某些部分。比如下面这个例子,如果我想获取customer02的详细信息。如果我用这个表达式:
Name:\s*(.+)
那么显然我会得到三个结果。所以我想限制搜索,只在customer02的详细信息下进行,直到遇到customer03为止。当然,我可以使用结果的索引(比如结果 = ['Mr Smith','Mr Jones','Mr Brown'],所以我可以用results[1]),但这样感觉有点笨。
[Customer01]
Name: Mr Smith
Address: Somewhere
Telephone: 01234567489
[Customer02]
Name: Mr Jones
Address: Laandon
Telephone:
[Customer03]
Name: Mr Brown
Address: Bibble
Telephone: 077764312
5 个回答
1
这个数据是什么格式的?是字符串吗?如果效率不是特别重要,最简单的方法就是把字符串切分一下:
start = cdata.find("[Customer01]")
end = cdata.find("[Customer02]")
result = re.search('Name:\s*(.+)', cdata[start:end]).group(0)
或者可以更简洁一些:
name = re.search('Name:\s*(.+)', cdata[cdata.find("[Customer01]"): cdata.find("[Customer02]")]).group(0)
补充:或者加上错误检查:
start = cdata.find("[Customer01]")
end = cdata.find("[Customer02]")
result = re.search('Name:\s*(.+)', cdata[start:end])
if result: name = result.group(0)
3
这个问题不是正则表达式能解决的。你最好的办法是先把数据解析成结构化的形式(可以考虑用正则表达式来帮助“分块”数据)。
1
如果你已经知道要搜索的具体范围,并且想要获取一个捕获组,那为什么不直接这样做呢:
import re
text = "[Customer01]\nName: Mr Smith\nAddress: Somewhere\nTelephone: 01234567489\n[Customer02]\nName: Mr Jones\nAddress: Laandon\nTelephone:\n[Customer03]\nName: Mr Brown\nAddress: Bibble\nTelephone: 077764312"
blah = re.search("[Customer02]\nName:\s*(.*?)\n", text)
print blah.group(1)
这样会返回 "Mr Jones"。我想这就是你想要的结果。