2017-05-18 27 views
1

我目前正在解析有關電影的文件。 這裏是語言文件的例子:Python3解析並捕獲一行中的多個可選參數

"!Next?" (1994)      Italian 
"#1 Single" (2006)     English 
"#15SecondScare" (2015)     English 
"#15SecondScare" (2015) {Because We Don't Want You to Fall Asleep 
(#1.3)} English 
"#15SecondScare" (2015) {Coming and Going (#1.11)} English 
"#Adulthood" (????)     English 
"#Adulting" (2016/I)     English 

我如何能趕上名稱,年份,賽鬆,如果這是一個電視節目和每行的語言插曲? 有些參數並不總是存在(比如它是哪一集)?

這是我的嘗試: for line in file: print(re.findall('"(.*)"', line)) #name print(re.findall(r"\D(\d{4})\D",line)) #year

我已經有多年的麻煩,因爲它捕獲的集數。 正在做多種模式的路要走?

謝謝。

+1

我在努力,我認爲寫下我寫的東西是沒有用的,因爲我像我失去了一些東西一樣掉下來...... 我會編輯謝謝! – user4725217

+0

季節看起來可選,是嗎? – sln

+0

當它包含'{}'時,它必須是一個表演,括號是:{{Episode name(#SeasonNumber,episodeNumber)}' – user4725217

回答

1

你可以不喜歡它

import re 

string = """ 
"!Next?" (1994)      Italian 
"#1 Single" (2006)     English 
"#15SecondScare" (2015)     English 
"#15SecondScare" (2015) {Because We Don't Want You to Fall Asleep 
(#1.3)} English 
"#15SecondScare" (2015) {Coming and Going (#1.11)} English 
"#Adulthood" (????)     English 
"#Adulting" (2016/I)     English 
""" 

rx = re.compile(r''' 
      ^
      "(?P<name>[^"]+)" 
      [^(]+\((?P<year>[^)]+)\) 
      (?:[^\{^\n]+\{(?P<subtitle>[^}]+)\})? 
      \s+(?P<language>[A-Z][a-z]*) 
      $ 
      ''', re.MULTILINE | re.VERBOSE) 

movies = [(m.group('name'), m.group('year'), m.group('subtitle'), m.group('language')) 
      for m in rx.finditer(string)] 
print(movies) 
# [('!Next?', '1994', None, 'Italian'), ('#1 Single', '2006', None, 'English'), ('#15SecondScare', '2015', None, 'English'), ('#15SecondScare', '2015', "Because We Don't Want You to Fall Asleep \n (#1.3)", 'English'), ('#15SecondScare', '2015', 'Coming and Going (#1.11)', 'English'), ('#Adulthood', '????', None, 'English'), ('#Adulting', '2016/I', None, 'English')] 

matches on regex101.com的演示。


的解釋了一下:

  1. 首先,我們定義在詳細模式
  2. 我們的正則表達式我們使用編譯的模式rx國際熱核實驗堆在找到匹配
  3. 我們把結果元組中的已命名組。
  4. 我們最終得到了一個元組列表
+0

@ user4725217:該模式首先被編譯,然後迭代('finditer')。在我看來,使代碼更具可讀性。有關詳細信息,請參閱https://docs.python.org/3.6/library/re.html – Jan

+0

謝謝,您的鏈接解釋了它的好處:) – user4725217

+0

@ user4725217:在答案的末尾添加了一些解釋以及。 – Jan