在Python脚本中查找美国电话号码

38 投票
10 回答
123536 浏览
提问于 2025-04-16 05:03

下面这个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 个回答

8

我觉得这个正则表达式对于解析电话号码来说非常简单。

re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
27

这是构建一个提取电话号码的正则表达式的过程。

首先,我们需要匹配一个区号(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)
67

如果你想学习正则表达式(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

撰写回答