2016-05-31 10 views
1

regexを初めて使う。pythonでregexを使って特定の単語の間に大文字の単語を返す

私は、フォーム

   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 

内の文字列を持っている私は、余分な空白をお詫び申し上げますが、これは、私は、文字列を取得するために解析されたワード文書の形です。

第1部第2部と第3部の間のすべての見出しをキャプチャし、別のリストに格納する必要があります。これまでのところ私は持っています

私が正しく理解していれば、これらの周りは一種の基点としてPARTを使用し、その間にテキストをつかむべきです。しかし、私がコードを実行すると、matchedtextは何も塗りつぶされません。

私の問題の2番目の部分は、一度、各見出しの文字列を大文字の見出しだけをリストに保存する方法です。単語の文書の中の一部の文字列には小文字の単語が含まれていますが、すべて大文字で入力してください。

文字列内の特定の単語間でテキストを取得する方法と、リスト内の単語を個々の文字列として保存する方法をまとめたものです。

ありがとうございました! :D

答えて

4

正規表現を使用する必要はありません。単に文字列にsplit関数を使用してください。 Sはあなたの文字列の名前である場合、それは次のようになります。

s.split('PART') 

これは最初の部分の前にテキストが含まれますので、リストの最初の要素を使用しないでください。

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

あなたは後で、文字列メソッドisupperを使用して、単語がすべて大文字であるかどうかを確認できます。

+0

さて、分割はクールなトリックですが、私はisupperはカップルの理由のために働くだろうか分かりません。ときどき私の文字列には文章のサブテキストが含まれているので、isupperは文頭に大文字の単語をつけます。私はisupper realをquick = '' .joinで使ってみました([cの場合はcでtext_between_partsならc。isupper()])、数字も省略しませんでした。これが正規表現を使用しようとした理由です。 – Jstuff

+0

s.isupper()とs.isalpha()]の場合は 'texts_between_partsのcsplit()で' sを試してください ' –

+0

これはnewbyの質問ですそのコードは3回以上テキストを返すため、うまくいきません。私はこの中で何が起こるかを理解しようとしています。http://stackoverflow.com/questions/17006641/single-line-nested-for-loopsしかし、私はそれを私に説明することができます理解できないようですか?おかげで – Jstuff

1

パート1とパート2などの間にあるものはすべて忘れてしまいます。私は次の正規表現で各行を解析し、見出しのグループ化を決定するためにグループ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'、 '。'、 '建築家/エンジニア')

+0

この正規表現が何をしているのか説明できますか?私の現在の能力より少し上です。また、大文字の単語を探しているので、[^ a-z]は[^ A-Z]ですか? re.search( '^(\ d)(\。| \ d)+ \ s +([^ a-z] +?)\ s + \ d $'、text)のように実装するだけですか?おかげ – Jstuff

+0

行の^始まり は(\ d)の最初の桁/セクション番号 のためのグループを作成します(。\ | \ d)の0以上のサブセクション番号を取得する第2のグループを作成します.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 
関連する問題