2017-08-26 26 views
0

我試圖從我已經從PDF轉換爲Python石板庫文本的一些世衛組織代碼簿中提取數據。正則表達式(Python)數據提取 - 重疊或不完整的結果

我想打2個數字,破折號,2位,其次是一些文字開始,以「Q」 +1位或2位,並再次「Q」結尾的文本+1位或2位

17-17How old are you?Q1Q1 
31-31During the past 30 days, how many times per day did you usually eat fruit, such as bananas, apples, oranges, dates, or any other fruits?Q7Q11 

有時,這些短語的結束與一個空白,有時接下來的問題會立即開始(這裏有三個問題),觀察Q4Q424-29和Q5Q530-30

20-23How tall are you without your shoes on? (Note: Data are in meters.)Q4Q424-29How much do you weigh without your shoes on? (Note: Data are in kilograms.)Q5Q530-30During the past 30 days, how often did you go hungry because there was not enough food in your home?Q6Q7 

隨着

\d{2}-\d{2}[a-zA-Z0-9 .()?:,]+Q\d{1,2}Q\d(\d)*? 

我非常接近,但當第二個「Q」有兩位數字時,我錯過了第二個數字。

我試圖添加一個負前瞻

\d{2}-\d{2}[a-zA-Z0-9 .()?:,]+Q\d{1,2}Q\d((\d)(?!\d\d-)) 

排除有兩位數字,破折號模式的開始。

\d{2}-\d{2}[a-zA-Z0-9 .()?:,]+Q\d{1,2}Q\d{1,2} 

包括「Q」的第二個數字但產生重疊的結果,例如,在Q4Q424-29,第一個字符串以Q4Q42結尾,第二個字符串以4-29開頭。

與原樣品的文字部分的正則表達式是在這裏:https://regex101.com/r/d9Dlga/2/

任何建議,誰提取出正確的字符串,如:

17-17How old are you?Q1Q1 
20-23How tall are you without your shoes on? (Note: Data are in meters.)Q4Q4 
24-29How much do you weigh without your shoes on? (Note: Data are in kilograms.)Q5Q5 
31-31During the past 30 days, how many times per day did you usually eat fruit, such as bananas, apples, oranges, dates, or any other fruits?Q7Q11 

謝謝!

+0

你先行基於模式的接近,BOT您需要檢查單下面的數字,讓整個東西可選,如'Q \ d((\ d)(?!\ d - ))?' –

回答

2

我現在看到的問題。我認爲作品的新嘗試:

\d{2}-\d{2}.+?Q\d{1,2}Q\d{1,2}(?!\d-\d{2})

我把負先行在年底進行測試,如果一個新的部分已經開始。

  • 9場比賽
  • 正確抓住全2位數的結局

Demo

+0

感謝你們兩位!剛剛結束了我的晚上! –

0

以下模式應該工作:

\d{2}-\d{2}[a-zA-Z0-9 .()?:,]+Q\d{1,2}Q\d(\d(?!\d-))?

+1

_should_?是否或不是?你能否補充說明爲什麼你所做的改變實現了OP的目標? –

+0

取決於我是否正確理解OP的目標。這與我在發佈我的答案几秒前在評論中所寫的內容完全相同(但刪除了無用的括號)。 –

+0

我個人認爲你的回答是正確的,但我不是代碼專用答案的狂熱粉絲 - 似乎有人發現這個理由足以回答你的答案(不是我)。見例如https://meta.stackexchange.com/questions/148272/is-there-any-benefit-to-allowing-code-only-answers-while-blocking-code-only-ques –