2016-05-31 29 views
1

使用下面的字符串在python可選括號中的正則表達式

1 - GENERAL 1 

    1.1 RELATED DOCUMENTS 1 

    1.2 SUMMARY 1 

    1.3 DEFINITIONS 1 

    1.4 INFORMATIONAL SUBMITTALS 2 

    1.5 GENERAL COORDINATION PROCEDURES 2 

    1.6 COORDINATION DRAWINGS 3 

    1.7 REQUESTS FOR INFORMATION (RFIs) 4 

    1.8 PROJECT MEETINGS 6 

我試圖創建一個REGIT表達把3組的部分,標題和頁碼。到目前爲止,我有

(\d)(\.|\d|\s|-)+\s+([^a-z]+?)\s+\d 

它可以處理除(RFIs)以外的所有情況。我怎樣才能抓住這個呢? 注:有時字符串可能包含我不想要的小寫字母小節。這就是爲什麼[^ a-z]存在。此外,RFI可能並不總是括號中的文字。

更新:

END OF SECTION 



    Project No. 151219.00 012500 - 1 of 3 Substitution Procedures 

      Rev. 0, 07/23/15 

      Issued for Construction 
+0

顯示使其變得複雜的其他字符串(子部分,RFI)等的一些示例)。 –

+0

看起來像一個更簡單的「數字,其次是任何東西,後面是數字」是你真正需要的。 –

+0

's \ * [1-9 \。] * \ s * [AZ] az [(\)\ - \ s] + [AZ^az \(\)\ - ] \ s * [0-9] *' – CaffeineAddiction

回答

2

有包含在你的字符串主要由3部分。

首先是它主要由數字後跟小數和數字

其次是什麼,高達頁碼部分。這主要從字

三是在最後的頁碼是通常數字

你的正則表達式中包含一種不需要太多的交替。 所以,你可以使用這個表達式

^\s*(\b\d+(?:[.]\d+)?)\W+(.*?)\s*(\b\d+\b)$ 
    <----------------> <---> <-------> 
     Section   Content Page Number 

Regex Demo

如果小節可以包含像1.1.1值等,可以使用

^\s*(\b\d+(?:[.]\d+)*)\W+(.*?)\s*(\b\d+\b)$ 

正則表達式擊穿

\bword boundary

\W相當於​​這又是[^A-Za-z0-9_](介意這標誌着匹配除了那些字符類的東西^

^#start of string 
\s* #Match any spaces in starting 
(
    \b #word boundary 
    \d+ #Match digits 
    (?:[.]\d+)* #Non-capturing group to match . followed by digits any 
       #number of times(due to *). It matches after . like .1.1 etc 
) 
    \W+ #Match any non word character 
    (.*?) #Match anything upto page number given in next 
    \s* #Match spaces if there 
    (\b\d+\b) #Match page numbers in last(due to $). 
$ #End of string 
+0

爲什麼它更好?一點解釋會使這個答案好得多。 –

+0

真棒,工作!不過,我是新來的正則表達式。剛開始學習今天早上,這使我困惑,\ b \ d +(?:[。] \ d +)*)\ W +。你介意解釋這裏發生的事情嗎?謝謝 – Jstuff

+0

我還有一個問題給你rock321987。我正在解析的文件之一包含我在更新下發布的字符串,並且您提供的表達式會提取這些不需要的信息。如何編輯您提供的表達式來忽略這些表達式?謝謝 – Jstuff

0

我建議這樣的事情

^\s*([\d.]+)[\s-]*\s+(.+?)\s+(\d+)$ 

既然你說你在pyt當涉及評論等事情時,這會爲您提供更多的能力。例如:

^\s*(?#Section)([\d.]+)[\s-]*\s+(?#Title)(.+?)\s+(?#Page)(\d+)$ 

正則表達式是超級強大的,但通常如果您是新手或只是練習不可讀。在這些情況下評論是天賜之物!

完全實施應該是這樣的:

re.search(r'^\s*(?#Section)([\d.]+)[\s-]*\s+(?#Title)(.+?)\s+(?#Page)(\d+)$', input_string, re.M) 

其中re.M被指示應在MULTILINE模式下運行,使^匹配每一行的開頭,而不是整個輸入的開始。同樣用於$和行尾/輸入

+0

使用re.M標誌和^,&或re.findall和忽略該標誌和^,&? – Jstuff

+0

我想這種方法也可以工作,雖然這個方法會返回包含3個匹配項的組,每個匹配的較大數據集越難以追蹤edgecase,你的數據通過一個點或其他東西 –