【发布时间】:2020-01-10 16:43:43
【问题描述】:
我正在尝试将如下字符串分解为键/值对列表:
line1 = "keyword1: value1 keyword2: value2 keyword1: value3 keyword3: value4"
我使用正则表达式编写了以下代码来实现该目标:
import re
line1 = "keyword1: value1 keyword2: value2 keyword1: value3 keyword3: value4"
keywords = [ re.escape(k) for k in ['keyword1', 'keyword2', 'keyword3'] ]
any_keyword = '|'.join(keywords)
regex = "(" + any_keyword + "):(.+?)(?:" + any_keyword + "|$)"
print(line1)
print(regex)
for m in re.finditer(regex, line1):
print(m)
我得到的匹配是
<re.Match object; span=(0, 25), match='keyword1: value1 keyword2'>
<re.Match object; span=(34, 59), match='keyword1: value3 keyword3'>
当然,它们在字符串末尾包含关键字 2 和关键字 3,这样我就不会为这些关键字获得额外的 Match 对象。
我怎样才能收到 4 个匹配项,一行中的每个关键字一个匹配项?
【问题讨论】:
-
使用 lookahead -
regex = "(" + any_keyword + "):(.+?)(?=(?:" + any_keyword + "):|$)"。在关键字后的前瞻中添加:以使其更安全。见ideone.com/88o81D -
是否有机会在 key 和 value 中留出空间?恕我直言,就像@TJC Wood 的答案一样,只需在冒号周围查找非空格对
-
@WiktorStribiżew 您不需要在前瞻组中添加额外的非捕获组。只需
(?=key1|key2|key3|$)就可以了 -
@AdrianShum 因为
:是必要的。每个关键字后跟:,我们不想在值部分中的:之前停止匹配。 -
@WiktorStribiżew 啊哈!这说得通。我错过了你多余的冒号:)