1

最近、「Python Quick Book」から Python re モジュールについて少し学びました。

本のコードをテストしようとしました。私のコードにエラーがないことに加えて、ファイルに与えられたデータのパターンを認識していません。

    import re
regexp = re.compile(r"(?P<last>[-a-zA-Z]+)"
                    r"(?P<first>[-a-zA-Z]+)"
                    r" ( (?P<middle> ([-a-zA-Z]+)))?"
                    r": (?P<phone> (\d\d\d-)?\d\d\d-\d\d\d\d)"
                    )
file = open ('dir.txt', 'r')
for line in file.readlines():
    result = regexp.search(line)
    if result == None:
        print ("Oops, I don't think this is a record")
    else:
        lastname = result.group('last')
        firstname = result.group('first')
        middlename = result.group('middle')
        if middlename == None:
            middlename = ''
        phonenumber = result.group('phone')
        print ('Name:', firstname, middlename, lastname, ' Number: ',phonenumber)
file.close()

これが私のテキストファイルにあるデータです。

Khan, Ahmed Ali : 800-123-4567
Malik, Asif Ali : 800-123-7844
Shaikh, Muhammad Sharafat: 300-123-4444
Shah, Farhat Abbas : 321-822-2977
Adam, Khalid Ahmed : 000-124-5454

前もって感謝します。:)

4

2 に答える 2

5

入力データの正規表現が間違っています

これを修正するには、次のアプローチを取ります

Pythonの即時評価にドロップし、再インポートします

$ python
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re

入力行の1つとして文字列を定義します

>>> str="Khan, Ahmed Ali : 800-123-4567"

正規表現パターンを少しずつ適用して、何が失敗するかを確認します

>>> regexp = re.compile(r"(?P<last>[-a-zA-Z]+)")
>>> result=regexp.search(str)
>>> print result.group('last')
Khan

最初のものが機能するので、最初の2つを試してください

>>> regexp = re.compile(r"(?P<last>[-a-zA-Z]+)"
...                     r"(?P<first>[-a-zA-Z]+)")
>>> result=regexp.search(str)
>>> print result.group('last')
Kha
>>> print result.group('first')
n

まあ!注意深く見ると、strにはKhanの後にコンマとスペースがあるので、それを修正しましょう。

>>> regexp = re.compile(r"(?P<last>[-a-zA-Z]+),\s+"
... r"(?P<first>[-a-zA-Z]+)")
>>> result=regexp.search(str)
>>> print result.group('last')
Khan
>>> print result.group('first')
Ahmed
>>> 

1つの入力文字列で機能するまで、このような正規表現をインタラクティブに調整するだけです。次に、動作中の正規表現をプログラムにコピーして戻します

于 2013-02-11T09:43:07.163 に答える
1

コードでは、ミドル ネームの前に 2 つのスペースが必要です。

r" ( (?P<middle> ([-a-zA-Z]+)))?"
# ^ ^

代わりに、\s文字クラス*または+数量詞を使用する必要があります。また、明示的にファイルを閉じたり、re.search本当に必要なときに を使用しre.matchたり、 と比較したりすることNone==すべて悪い習慣です。代わりに、次のようにコードを記述します。

import re
regexp = re.compile(r"(?P<last>[-a-zA-Z]+), "
                    r"(?P<first>[-a-zA-Z]+)"
                    r"(\s+(?P<middle>[-a-zA-Z]+))?\s*"
                    r":\s*(?P<phone>(\d{3}-)?\d{3}-\d{4})$"
                    )
with open('dir.txt', 'r') as f:
    for line in f:
        result = regexp.match(line)
        if result is None:
            print ("Oops, I don't think this is a record")
            continue
        lastname = result.group('last')
        firstname = result.group('first')
        middlename = result.group('middle')
        if middlename is None:
            middlename = ''
        phonenumber = result.group('phone')
        print ('Name:', firstname, middlename, lastname, ' Number: ',phonenumber)
于 2013-02-11T09:30:02.197 に答える