限制正则表达式只在两点之间搜索

0 投票
5 回答
853 浏览
提问于 2025-04-16 10:48

我想知道如何限制正则表达式搜索文本的某些部分。比如下面这个例子,如果我想获取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"。我想这就是你想要的结果。

撰写回答