2015-06-12 37 views
0

我想用python提取菜單索引。菜單指數是這樣的樹:獲取菜單索引與正則表達式與python失敗,在線作品

1. 
1.1. 
1.1.1. 
2. 
3.1. 
3.2. 

爲了找到這個我寫了下面的代碼:

first = re.findall(r"[0-9]{1}[.]{1}(?:([0-9][.])?(?:([0-9]?[.]?)))" , menu) 

這是不行的,但是當我把正則表達式的正則表達式在線工具( http://www.regexr.com/)然後它的工作。

這怎麼可能?

+0

不知您預期的輸出? – Kasramvd

+0

你想提取哪個號碼? –

回答

1

實際上,你可以減少正則表達式很多的

re.findall(r"[0-9]\.(?:[0-9]\.){,2}" , menu) 

它能做什麼?

  • [0-9]符合數字。我已經放棄{1},因爲這種模式與單個字符匹配很重要。

  • \.匹配.,逃脫了特殊的含義。

  • (?:[0-9]\.){,2}匹配數字,然後是.,最小零次和最大2次。

測試

>>> string = """1. 
... 1.1. 
... 1.1.1. 
... 2. 
... 3.1. 
... 3.2.""" 
>>> re.findall(r"[0-9]\.(?:[0-9]\.){,2}" , string) 
['1.', '1.1.', '1.1.1.', '2.', '3.1.', '3.2.'] 
1
[0-9][.](?:(?:[0-9][.])?(?:(?:[0-9]?[.]?))) 

您需要全部製作capturing groupsnon capturingre.findall給出了所有groups的列表,如果有任何present.You有2組,所以你可能只獲得這些。參見演示。

https://regex101.com/r/hI0qP0/5

您還可以使用(?:[0-9][.])+(?:[0-9][.]){1,3}

查看演示。

https://regex101.com/r/hI0qP0/6

1

這可能是更謹慎地考慮到章節任意數量的數字(即,可能有超過10個章節或超過10項/子項) 。在這種情況下,你可以只使用

(\d+)\.

此正則表達式週期後發現數字和數字相匹配;因此,你會爲一個單行:

>>> re.findall(r"(\d+)\." , "3.2.1.") 
['3', '2', '1'] 

如果應用正則表達式的整個字符串,你會得到的序列中的所有號碼;即爲您的字符串,['1', '1', '1', '1', '1', '1', '2', '3', '1', '3', '2', '3']。我不太明白你想要匹配哪些數據,或者你想用它做什麼,所以,好好調整一下。:-)

要獲得與索引的數字列表,你可以使用:

>>> [re.findall(r"(\d+)", i) for i in string.split('\n')] 
[['1'], ['1', '1'], ['1', '1', '1'], ['2'], ['3', '1'], ['3', '2'], ['3', '3']] 

乾杯, 聖保羅