以下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
答案 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