簡體   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