Python正则表达式(来自快速书)

时间:2013-02-11 09:10:03

标签: python regex

我最近从“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

提前致谢。 :)

2 个答案:

答案 0 :(得分: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

将字符串定义为输入行之一

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

一次应用一点regexp模式以查看失败的内容

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

所以第一个工作,尝试前两个

>>> 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 :(得分:1)

您的代码在中间名称前需要两个空格:

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)