Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Regex:如何匹配字符串末尾的键值对序列_Python_Regex_Key Value - Fatal编程技术网

Python Regex:如何匹配字符串末尾的键值对序列

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的解决方案,我现在

我试图匹配出现在(长)字符串末尾的键值对。字符串看起来像(我替换了“\n”)

所以我希望匹配“key1:val1单词”、“key2:val2单词”和“key3:val3单词”

  • 可能的密钥名称集是已知的
  • 并非所有可能的键都出现在每个字符串中
  • 每个字符串中至少出现两个键(如果这样更容易匹配的话)
  • 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])