2017-08-13 32 views
1

如果我有一個鬆散形式的輸入文件(當我說鬆散形式時,我的意思是並非所有行都包含所有信息,如後面所解釋的) :Python正則表達式分析多個可能存在也可能不存在的組的輸入

23 1990-10-10 Clark Kent 

我想定義一組年齡,日期和名字,我怎麼去提取這些到一個名爲groupdict()如

{ age: 23, date: '1990-10-10', name: 'Clark Kent' } 

如果字段年齡或日期缺失,如:

1990-10-10 Clark Kent 

23 Clark Kent 

的羣體應該還是可以被解析併爲它找不到領域返回None。

{ age: 23, date: None, name: 'Clark Kent' } 

現在:

re.match(r'(?P<age>[0-9]+)?\s*(?P<birthday>\d\d\d\d\-\d\d\-\d\d)?\s*(?P<name>(\w|\s)+)', 
"23 1990-10-10 Clark Kent") 

返回所需的輸出。

然而當測試字符串是:

"1990-10-10 Clark Kent" 

然後年齡參數抓住最初的199貪婪和生日不能正確解析。

你將如何去解析這個文件來允許抓取任何可以抓取的字段?

+0

你可以分享HTML源代碼以及如何從中獲得'23 1990-10-10 Clark Kent'?通常正則表達式不是你需要從網頁上獲取數據... – Andersson

回答

3

使組可選的包括空間分離器,由一個非捕獲組內連接它們,像

(?:(?P<age>[0-9]+) +)?(?:(?P<birthday>\d\d\d\d\-\d\d\-\d\d) +)?(?P<name>[\w ]+) 

參見https://regex101.com/r/a41VTh/1

我已經使用字面空格作爲分離器,以避免線重疊由於匹配\s也匹配換行符。如果需要,您可能需要添加一個標籤[ \t]

+0

哇,這太神奇了!你介意解釋如何讓這些非捕獲組織進行這項工作? –

+0

@Master_Yoda我沒有讓這些組不被捕獲(因爲它們仍然存在,並且沒有從原始模式中改變),它們被包圍在非捕獲組中,以將它們與分離空間保持在一起。 –

+0

超級有趣,謝謝! –

1

還沒有問了這個。不過,我認爲值得一提的是,pyparsing往往是一個更容易替代正則表達式應該考慮。

我首先爲輸入定義語法。

  • 日期是由連字符分隔的一系列數字。
  • 年齡是最長兩位數字的數字。
  • 名稱是帶散佈空白的字母字符。 (這或許應該連字符和撇號加以改進。)

我說的是一個可選的年齡(隱含的)跟着一個可選的日期,其後是一個必要的名稱做一個完整的whole

我想你會同意這與正則表達式相比相當簡單。

例如,像('age')這樣的東西可以將解析出的項目保存爲代碼檢索結果。

>>> import pyparsing as p 
>>> date = p.Word(p.nums+'-') 
>>> age = p.Word(p.nums, max=2) 
>>> name = p.Word(p.alphas+' ') 
>>> whole = p.Optional(age)('age') + p.Optional(date)('date') + name('name') 

現在我可以對你的字符串運用這個語法。如所示,result的行爲如同dict。我包含從每個字符串解析的任何項目。

>>> result = whole.parseString('23 1990-10-10 Clark Kent') 
>>> [result[_] for _ in ['age', 'date', 'name'] if _ in result] 
['23', '1990-10-10', 'Clark Kent'] 
>>> result = whole.parseString('1990-10-10 Clark Kent') 
>>> [result[_] for _ in ['age', 'date', 'name'] if _ in result] 
['1990-10-10', 'Clark Kent'] 
>>> result = whole.parseString('23 Clark Kent') 
>>> [result[_] for _ in ['age', 'date', 'name'] if _ in result] 
['23', 'Clark Kent'] 
+0

您也可以使用'print(result.dump())'' – PaulMcG

+0

查看哪些名稱被解析爲嵌套結構謝謝Paul。我現在使用它,可能是根據你在其他地方提供的建議。在這個答案中,我想強調可以做出整齊的pyparsing結果。 –

相關問題