2016-05-31 26 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 
相关问题