1

Rubular では、正規表現を作成しました。

(Prerequisite|Recommended): (\w|-| )*

太字に一致します:

推奨: コンピューターと一部のアートに十分な快適さ。

夏。2クレジット。前提条件:新入生前の地位またはインストラクターの許可。単位は工学の学位には適用されない場合があります。SUグレードのみ。

Python での正規表現の使用を次に示します。

note_re = re.compile(r'(Prerequisite|Recommended): (\w|-| )*', re.IGNORECASE)

def prereqs_of_note(note):
    match = note_re.match(note)
    if not match:
        return None
    return match.group(0) 

残念ながら、コードはNone一致の代わりに次を返します。

>>> import prereqs

>>> result  = prereqs.prereqs_of_note("Summer. 2 credits. Prerequisite: pre-fres
hman standing or permission of instructor. Credit may not be applied toward engi
neering degree. S-U grades only.")

>>> print result
None

ここで何が間違っていますか?

更新:re.search()代わりに必要re.match()ですか?

4

1 に答える 1

2

re.search()文字列をスキャンするので使いたい。re.match()文字列の先頭にパターンを適用しようとするため、望ましくありません。

>>> import re
>>> s = """Summer. 2 credits. Prerequisite: pre-freshman standing or permission of instructor. Credit may not be applied toward engineering degree. S-U grades only."""
>>> note_re = re.compile(r'(Prerequisite|Recommended): ([\w -]*)', re.IGNORECASE)
>>> note_re.search(s).groups()
('Prerequisite', 'pre-freshman standing or permission of instructor')

また、「instructor」という単語に続く最初のピリオドを過ぎて一致させたい場合は、リテラル「.」を追加する必要があります。あなたのパターンに:

>>> re.search(r'(Prerequisite|Recommended): ([\w -\.]*)', s, re.IGNORECASE).groups()
('Prerequisite', 'pre-freshman standing or permission of instructor. Credit may not be applied toward engineering degree. S-U grades only.')

パターンをより貪欲にして、行の残りの部分と一致させることをお勧めします。

>>> re.search(r'(Prerequisite|Recommended): (.*)', s, re.IGNORECASE).groups()
('Prerequisite', 'pre-freshman standing or permission of instructor. Credit may not be applied toward engineering degree. S-U grades only.')

.*リテラル「.」を追加した前のパターンは、この例と同じものを返します。

于 2010-05-09T23:18:11.590 に答える