在python脚本中编辑正则表达式

时间:2010-10-10 17:05:07

标签: python regex

以下python脚本允许我使用正则表达式从给定文件中抓取电子邮件地址。

我正在尝试将电话号码添加到正则表达式中。我创建了这个正则表达式,似乎适用于7位和10位数字:

(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})

这可以添加到我现有的正则表达式中吗?我想我需要编辑我在哪里使用re.compile但不完全确定如何在python中执行此操作。任何帮助将不胜感激。

# filename variables
filename = 'file.txt'
newfilename = 'result.txt'

# read the file
if os.path.exists(filename):
        data = open(filename,'r')
        bulkemails = data.read()
else:
        print "File not found."
        raise SystemExit

# regex = something@whatever.xxx
r = re.compile(r'(\b[\w.]+@+[\w.]+.+[\w.]\b)')
results = r.findall(bulkemails)
emails = ""
for x in results:
        emails += str(x)+"\n"

# function to write file
def writefile():
        f = open(newfilename, 'w')
        f.write(emails)
        f.close()
        print "File written."

修改http://en.wikipedia.org/wiki/Telephone_number上运行时 它产生以下输出:

2678400
2678400
2678400
2678400
2678400
2678400
2678400
2678400
2678400
8790468
9664261
555-1212
555-9225
555-1212
869-1234
555-5555
555-1212
867-5309
867-5309
867-5309
(267) 867-5309
(212) 736-5000
243-3460
2977743
1000000
2048000
2048000
8790468
9070412
9664261
9664261
9664261

2 个答案:

答案 0 :(得分:1)

我不建议结合两个正则表达式。这是可能的,但它会使代码更难以理解和维护。

(另外,将正则表达式分开将让您以不同的方式处理电子邮件和电话号码,这可能是您想要做的。)

答案 1 :(得分:0)

首先,我会简化你的正则表达式:

(?:\(?\b\d{3}\)?[-.\s]*)?\d{3}[-.\s]*\d{4}\b

将匹配与之前相同的正确数字,并减少错误点击次数。

其次,您的电子邮件正则表达式将错过许多有效的电子邮件地址,并且也有许多误报(例如,它会匹配aaaa @@@@ aaaa)。虽然使用正则表达式永远无法将电子邮件地址与100%可靠性匹配,但以下情况也更好:

\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b

(编译时使用不区分大小写的选项)。

要限制自己使用一些顶级域名,您可以使用

\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+(?:asia|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[A-Z]{2})\b