在Python脚本中查找美国电话号码
下面这个Python脚本可以让我从指定的文件中提取电子邮件地址,使用的是正则表达式。
我想知道怎么改进这个脚本,让它也能提取电话号码。比如说,电话号码可以是7位数字或者10位数字(带区号),还要考虑到括号的情况。
我现在的脚本如下:
# 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."
用于电话号码的正则表达式:
(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})
另一种用于电话号码的正则表达式:
(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?
相关问题:
10 个回答
我觉得这个正则表达式对于解析电话号码来说非常简单。
re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
这是构建一个提取电话号码的正则表达式的过程。
首先,我们需要匹配一个区号(3位数字)、一个主号码(3位数字)和一个分机号(4位数字):
reg = re.compile("\d{3}\d{3}\d{4}")
现在,我们想要捕捉到匹配的电话号码,所以我们在我们感兴趣的部分周围加上括号(也就是全部部分):
reg = re.compile("(\d{3}\d{3}\d{4})")
区号、主号码和分机号之间可能会有最多3个非数字字符的分隔(比如用空格、连字符或点来分隔):
reg = re.compile("(\d{3}\D{0,3}\d{3}\D{0,3}\d{4})")
现在,电话号码可能实际上是以一个 ( 字符开头的(如果区号是用括号括起来的话):
reg = re.compile("(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")
现在整个电话号码可能嵌在一堆其他文本中:
reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")
现在,那些其他文本可能还包括换行符:
reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?", re.S)
祝你玩得开心!
我个人在这里就停止了,但如果你真的想确保只有空格、连字符和点被用作分隔符,你可以尝试以下方法(未经测试):
reg = re.compile(".*?(\(?\d{3})? ?[\.-]? ?\d{3} ?[\.-]? ?\d{4}).*?", re.S)
如果你想学习正则表达式(Regex),可以尝试自己写一下。其实并没有想象中那么难。像RegexPal这样的网站,可以让你输入一些测试数据,然后写一个正则表达式来测试这些数据。你可以在RegexPal上试着添加一些你预期会遇到的电话号码格式(比如带括号、区号等等),再找一份正则表达式速查表,看看你能做到什么。如果没别的帮助,至少能让你更容易理解别人写的表达式。
编辑:
这是你正则表达式的一个修改版本,它也能匹配没有连字符、空格或点的7位和10位电话号码。我在字符类(即方括号[])后面加了问号,这样里面的内容就变成可选的了。我在RegexPal上测试过,但因为我还在学习正则表达式,所以不确定它是否完美。你可以试试看。
(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})
它在RegexPal中匹配了以下值:
000-000-0000
000 000 0000
000.000.0000
(000)000-0000
(000)000 0000
(000)000.0000
(000) 000-0000
(000) 000 0000
(000) 000.0000
000-0000
000 0000
000.0000
0000000
0000000000
(000)0000000