2016-05-31 49 views
1

我是使用正則表達式的新手。在python中使用正則表達式來返回特定單詞之間的大寫單詞

我在形式

   Waco, Texas  

       Unit Dose 13 and 





      SECTION 011100  SUMMARY OF WORK 





    INDEX PAGE 



PART 1. - GENERAL 1 

1.1. RELATED DOCUMENTS 1 

1.2. PROJECT DESCRIPTION 1 

1.3. OWNER 1 

1.4. ARCHITECT/ENGINEER 2 

1.5. PURCHASE CONTRACTS 2 

1.6. OWNER-FURNISHED ITEMS 2 

1.7. CONTRACTOR-FURNISHED ITEMS 3 

1.8. CONTRACTOR USE OF PREMISES 3 

1.9. OWNER OCCUPANCY 3 

1.10. WORK RESTRICTIONS 4 

PART 2. - PRODUCTS - NOT APPLICABLE 4 

PART 3. - EXECUTION - NOT APPLICABLE 4 

我爲多餘的空白道歉的字符串,但是這是我解析,以獲取字符串word文檔的形式。

我需要捕獲第1部分第2部分和第3部分之間的所有標題,並將它們存儲在不同的列表中。到目前爲止,我有

matchedtext = re.findall('(?<=PART) (.*?) (?=PART)', text, re.DOTALL) 

如果我理解正確的話,這些變通一下應該使用部分作爲一種基點和搶之間的文本。但是,在運行代碼時,匹配文本不會填充任何內容。

我的問題的第二部分是一旦我有部分不同事件之間的文本部分如何保存列表中每個標題的字符串的大寫標題。我的文檔中的一些字符串包含小寫字母,但我只想要所有字母都是大寫字母。

因此,總結一下如何獲取字符串中特定單詞之間的文本,並且一旦我擁有這些單詞,我如何才能將單詞保存爲列表中的單個字符串。

感謝您的幫助! :D

回答

4

你甚至不需要使用正則表達式,只需使用split函數的字符串。如果s是你的字符串的名稱,這將是:

s.split('PART') 

這將包括第一部分之前的文本,所以不要用列表的第一個元素:

texts_between_parts = s.split('PART')[1:] 

你可以稍後使用字符串方法isupper檢查單詞是否全部大寫。

+0

好吧,分裂是一個很酷的技巧,但我不知道isupper會的一對夫婦的原因工作。有時我的字符串包含帶有句子的子句,所以isupper會在句子的開頭抓住大寫字母。我嘗試使用isupper真正快速與上=''.join([c for c in text_between_parts if c。isupper()]),它也沒有忽略數字。這就是爲什麼我試圖使用正則表達式 – Jstuff

+0

如果s.isupper()和s.isalpha()]' –

+0

對不起,這是一個newby問題,請嘗試'[s for s in c.split()for c in textsbetweenbetweenparts ,但是該代碼不起作用,因爲它將文本返回3次。我想了解使用這個http://stackoverflow.com/questions/17006641/single-line-nested-for-loops發生了什麼,但我似乎無法理解它,你能解釋給我嗎?謝謝 – Jstuff

1

我會忘記抓住第一部分和第二部分之間的一切,等等。我會用下面的正則表達式解析每一行,並使用組1來確定標題的分組。

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

組1是部件號/第

組2是次區段

組3設置在標題

import re 

p = re.compile('^(\d)(\.|\d)+\s+([^a-z]+?)\s+\d$') 

m = p.match('1.4. ARCHITECT/ENGINEER 2') 

if m: 

    print('Match found: ', m.groups()) 

else: 

    print('No match') 

匹配實測值: ('1','。','ARCHITECT/ENGINEER')

+0

你能解釋這個正則表達式的作用嗎?這比我目前的能力略高。還應該[^ a-z]是[^ A-Z],因爲它正在尋找大寫字母?它是否會像這樣實現:match = re.search('^(\ d)(\。| \ d)+ \ s +([^ a-z] +?)\ s + \ d $',text)?感謝 – Jstuff

+0

^線 (\ d)創建組的第一個數字/區段的開頭數 (\ | \ d)創建捕獲0或多個小節數.1.1 \ S的第二組+捕捉任何空間 ([^ AZ])創建第三組捕獲任何不包含小寫字母 \ S +捕捉剩餘空間 \ d $捕獲在 – tanuki505

+0

線好吧結束頁碼,這是有道理的,但當我運行它時,它找不到任何匹配。我正在試圖找出原因。 – Jstuff

0
import re 
p = re.compile('^(\d)(\.|\d)+\s+([^a-z]+?)\s+\d$') 
m = p.match('1.4. ARCHITECT/ENGINEER 2') 
if m: 
    print('Section: ', m.group(1)) 
    print('Heading: ', m.group(3)) 
else: 
    print('No match') 

# Output 
# Section: 1 
# Heading: ARCHITECT/ENGINEER 
相關問題