[英]Python regex: Lookbehind + Lookahead with characterset
我想将字符串10M5D8P放入字典中:
M:10,D:5,P:8等...
该字符串可以更长,但始终是一个数字,后跟该字母表中的单个字母:MIDNSHP = X
第一步,我想使用先行查找和先行拆分字符串,在两种情况下均匹配此正则表达式:[0-9] + [MIDNSHP = X]
所以我目前无法正常工作的解决方案如下所示:
汇入
re.compile( “(?<= [0-9] + [MIDNSHP = X])(?= [0-9] + [MIDNSHP = X])”)。分裂( “10M5D8P”)
它给了我我不明白的错误消息:“向后看需要固定宽度模式”
您可以使用re.findall。
>>> import re
>>> s = "10M5D8P"
>>> {i[-1]:i[:-1] for i in re.findall(r'[0-9]+[MIDNSHP=X]', s)}
{'M': '10', 'P': '8', 'D': '5'}
>>> {i[-1]:int(i[:-1]) for i in re.findall(r'[0-9]+[MIDNSHP=X]', s)}
{'M': 10, 'P': 8, 'D': 5}
您的正则表达式将无法正常工作,因为re
模块不支持可变长度的后置断言。 而且它也不支持在零宽度边界上分割,因此(?<=\\d)(?=[AZ])
也不可能。
look-behind requires fixed-width pattern
意味着它的确切含义-向后查找模式必须与Python引擎中的固定数量的字符匹配。 特别是,不允许包含任何量词( ?
, +
, *
)。 因此,我们应该选择一个固定宽度的片段用作后面的内容:
(?<=[MIDNSHP=X])(?=\d)
这仅使用单个字符作为后向标记,并使用单个数字作为前瞻。 但是,如果尝试使用此表达式split
,则由于Python错误3262 ,它将失败。 您需要改用以下解决方法:
>>> re.compile(r"(?<=[MIDNSHP=X])(?=\d)").sub('|', '10M5D8P').split("|")
['10M', '5D', '8P']
但这很丑。 一个更简单的解决方案是使用findall
提取所需内容 :
>>> re.findall('([0-9]+)([MIDNSHP=X])', '10M5D8P')
[('10', 'M'), ('5', 'D'), ('8', 'P')]
您可以从中轻松创建字典:
>>> {k:int(v) for v,k in re.findall('([0-9]+)([MIDNSHP=X])', '10M5D8P')}
{'P': 8, 'M': 10, 'D': 5}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.