在python scrip中查找电话号码

2024-04-18 22:25:34 发布

您现在位置: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})

电话号码的另一个regex:

(?:(?:\+?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+))?

Tags: txt脚本readdata电话号码openfilenameresults
3条回答

如果你对学习Regex感兴趣,你可以尝试自己编写它。这并不像人们想象的那么难。像RegexPal这样的站点允许您输入一些测试数据,然后针对这些数据编写并测试正则表达式。使用RegexPal,尝试添加一些您希望找到的各种格式的电话号码(带括号、区号等),获取一个Regex cheatsheet并查看您能走多远。如果没有别的,它将有助于阅读其他人的表达。

编辑: 这是您的Regex的一个修改版本,它还应该匹配缺少任何连字符、空格或点的7位和10位电话号码。我在字符类(the[]s)后面添加了问号,这使得其中的任何内容都是可选的。我在RegexPal中测试了它,但是由于我还在学习Regex,我不确定它是否完美。试试看。

(\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

这是创建电话号码刮除regex的过程。

首先,我们需要匹配一个区号(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对于解析电话号码非常简单

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

相关问题 更多 >