2016-10-02 26 views
2

如何使用pyparsing提取給定範圍內的數字? 我想:用pyparsing分析給定範圍內的數字

# Number lower than 12: 
number = Word(nums).addCondition(lambda tokens: int(tokens[0]) < 12) 

test_data = "10 23 11 14 115" 
print number.searchString(test_data) 

但它返回:

[['10'], ['3'], ['11'], ['4'], ['5']] 

我要的是:

[['10'], ['11']] 

更多個具體例子: 我想提取,看起來像的一部分,所有數字一個日期並忽略其他人。 所以,從這個輸入:

""" 
This is a date: 12 03 2008 
This too: 03 12 2008 
And this not, values are too large: 123 333 11 
""" 

我想:

[[12, 3, 2008], [3, 12, 2008]] 

回答

0

這裏的主要問題是,搜索字符串(和底層scanString)經過輸入字符串逐個字符尋找匹配。因此,在您輸入(與基準位置報頭):

  1 
<- position 
10 23 11 14 115 

searchString的經過以下步驟:

  • 發現數字「10」在位置0時,該匹配「小於12」的條件,因此這是一個匹配
  • 提前到位置2
  • 跳過的空白,提前到位置3
  • 發現數字「23」在3位,但這種失敗的條件
  • 提前一個地方到位置3
  • 發現數字「3」,這中的條件匹配,所以被接受作爲匹配
  • 認定號碼「11」,這是一個匹配,提前位置8
  • 跳過空白,前進到位置9
  • 認定號碼「14」,這失敗條件
  • 提前一個地方到位置10
  • 發現數字「4」,這通狀態,因此接受作爲匹配
  • 廣告萬斯夫婦並且發現號碼「115」,並且不能
  • 前進一個位置,並發現數字「15」,並且將失敗
  • 前進一個位置,並發現數字「5」,並且接受作爲匹配

給出您發佈的結果,[['10'], ['3'], ['11'], ['4'], ['5']]

一個快速的解決辦法是改變你的number定義添加asKeyword=True

number = Word(nums, asKeyword=True) 

作爲關鍵字強制表達只如果在空格分隔的單詞的開頭匹配。在你的情況下,這將防止意外解析'23'中的'3'和'14'中的'4'等。這將給你想要的結果[['10'], ['11']]

+0

它的工作原理。謝謝。 –