繁体   English   中英

Python regex:具有字符集的Lookbehind + Lookahead

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM