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