Python Regex:如何匹配字符串末尾的键值对序列
我试图匹配出现在(长)字符串末尾的键值对。字符串看起来像(我替换了“\n”) 所以我希望匹配“key1:val1单词”、“key2:val2单词”和“key3:val3单词”Python Regex:如何匹配字符串末尾的键值对序列,python,regex,key-value,Python,Regex,Key Value,我试图匹配出现在(长)字符串末尾的键值对。字符串看起来像(我替换了“\n”) 所以我希望匹配“key1:val1单词”、“key2:val2单词”和“key3:val3单词” 可能的密钥名称集是已知的 并非所有可能的键都出现在每个字符串中 每个字符串中至少出现两个键(如果这样更容易匹配的话) val单词可以是多个单词 键值对应仅在字符串末尾匹配 我正在使用pythonre模块 我在想 re.compile('(?:tag1|tag2|tag3):') 编辑: 基于Mikel的解决方案,我现在
- 可能的密钥名称集是已知的
- 并非所有可能的键都出现在每个字符串中
- 每个字符串中至少出现两个键(如果这样更容易匹配的话)
- val单词可以是多个单词
- 键值对应仅在字符串末尾匹配
- 我正在使用pythonre模块
re.compile('(?:tag1|tag2|tag3):')
编辑:
基于Mikel的解决方案,我现在使用以下方法:
my_tags=['\S+']#获取所有标记
my_tags=['tags'、'Author'、'Posted']#所选标记
regex=re.compile(r''
\n#所有键值对都在单独的行上
(#启动要返回的组
(?:{0}):#用于检测“\S+”==all的标记的占位符
\s#在“:”和值之间的空间
.*
)#要返回的端组
''.format('|'.join(my_标记)),re.VERBOSE)
regex.sub(“”,my_str)#返回my_str而不匹配键值行
regex.findall(my_str)#返回匹配的键值行
负零宽度前瞻是(?!模式)
这一点已经提到了一部分
(?!…)
匹配如果。。。下一个不匹配。这是一个消极的前瞻性断言。例如,Isaac(?!Asimov)只有在后面没有“Asimov”时才会与“Isaac”匹配
因此,您可以使用它来匹配键后的任意数量的单词,但不能使用类似(?!\S+:)\S+
的键
完整的代码如下所示:
regex = re.compile(r'''
[\S]+: # a key (any word followed by a colon)
(?:
\s # then a space in between
(?!\S+:)\S+ # then a value (any word not followed by a colon)
)+ # match multiple values if present
''', re.VERBOSE)
matches = regex.findall(my_str)
pairs = dict([match.split(':', 1) for match in matches])
给
['key1: val1-words ', 'key2: val2-words ', 'key3: val3-words']
如果使用以下方式打印键/值:
for match in matches:
print match
它将打印:
key1: val1-words
key2: val2-words
key3: val3-words
或者使用更新的示例,它将打印:
Thème: O sombres héros
Contraintes: sous titrés
Author: nicoalabdou
Tags: wakatanka productions court métrage kino session humour cantat bertrand noir désir sombres héros mer medine marie trintignant femme droit des femmes nicoalabdou pute soumise
Posted: 06 June 2009
Rating: 1.3
Votes: 3
您可以使用以下方法将每个键/值对转换为字典:
regex = re.compile(r'''
[\S]+: # a key (any word followed by a colon)
(?:
\s # then a space in between
(?!\S+:)\S+ # then a value (any word not followed by a colon)
)+ # match multiple values if present
''', re.VERBOSE)
matches = regex.findall(my_str)
pairs = dict([match.split(':', 1) for match in matches])
这样可以更容易地只查找所需的键(和值)
更多信息:
键值对真的只是由空格字符分隔吗?最好给出一个真实的例子(可能只是最后100个字符)。如果val3单词可以是任意长的字符串,“键值对应该只在字符串末尾匹配”是什么意思?@phynfo,我检查了原始数据,实际上有换行符,这可能会使这更容易。见我编辑的帖子@Janne这意味着从字符串的末尾开始,我要匹配我能找到的所有连续的“key:val words”对,其中key来自预定的集合。哇,非常感谢您的解决方案和解释,有没有办法将可能的key限制为一组单词?例如,类似于(?:tag1 | tag2 | tag3)而不是[\S]+的东西?但我认为目前的解决方案会很好。
pairs = dict([match.split(':', 1) for match in matches])