在python脚本中查找电话号码

Aar*_*ron 20 python regex

以下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."
Run Code Online (Sandbox Code Playgroud)

正则表达式的电话号码:

(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})
Run Code Online (Sandbox Code Playgroud)

电话号码的另一个正则表达式:

(?:(?:\+?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+))?
Run Code Online (Sandbox Code Playgroud)

Aug*_*ste 37

如果你有兴趣学习正则表达式,你可以自己写一下.它并不像它的那么难.像RegexPal这样的网站允许您输入一些测试数据,然后针对该数据编写和测试正则表达式.使用RegexPal,尝试以您希望找到的各种格式添加一些电话号码(使用括号,区号等),获取正则表达式备忘单并查看您可以获得多少.如果不出意外,它将有助于阅读其他人的表达.

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

(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})
Run Code Online (Sandbox Code Playgroud)

它与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
Run Code Online (Sandbox Code Playgroud)


dot*_*hen 20

这是建立电话号码抓取正则表达式的过程.

首先,我们需要匹配区号(3位数),中继线(3位数)和扩展名(4位数):

reg = re.compile("\d{3}\d{3}\d{4}")
Run Code Online (Sandbox Code Playgroud)

现在,我们想要捕获匹配的电话号码,因此我们在我们有兴趣捕获的部分(所有部分)周围添加括号:

reg = re.compile("(\d{3}\d{3}\d{4})")
Run Code Online (Sandbox Code Playgroud)

区号,主干和分机最多可以分隔3个不是数字的字符(例如空格与连字符/点分隔符一起使用的情况):

reg = re.compile("(\d{3}\D{0,3}\d{3}\D{0,3}\d{4})")
Run Code Online (Sandbox Code Playgroud)

现在,电话号码实际上可能以(字符开头(如果区号括在括号中):

reg = re.compile("(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")
Run Code Online (Sandbox Code Playgroud)

现在,整个电话号码可能嵌入了许多其他文本中:

reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?")
Run Code Online (Sandbox Code Playgroud)

现在,其他文本可能包含换行符:

reg = re.compile(".*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?", re.S)
Run Code Online (Sandbox Code Playgroud)

请享用!

我个人就此止步,但是如果你真的想确保只使用空格,连字符和点作为分隔符,那么你可以尝试以下(未经测试):

reg = re.compile(".*?(\(?\d{3})? ?[\.-]? ?\d{3} ?[\.-]? ?\d{4}).*?", re.S)
Run Code Online (Sandbox Code Playgroud)


use*_*959 7

我认为这个正则表达式非常简单,可以解析电话号码

re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
Run Code Online (Sandbox Code Playgroud)


Ali*_*eri 6

下面是对上面答案的补充。此正则表达式还能够检测国家/地区代码:

((?:\+\d{2}[-\.\s]??|\d{4}[-\.\s]??)?(?:\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4}))
Run Code Online (Sandbox Code Playgroud)

它可以检测以下样本:

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

# Detect phone numbers with country code
+00 000 000 0000
+00.000.000.0000
+00-000-000-0000
+000000000000
0000 0000000000
0000-000-000-0000
00000000000000
+00 (000)000 0000
0000 (000)000-0000
0000(000)000-0000 
Run Code Online (Sandbox Code Playgroud)

截至 2022 年 5 月 3 日更新:

我修复了上面电话号码检测正则表达式中的一些问题,您可以在下面的链接中找到它。完成正则表达式以包含更多国家/地区代码。

https://regex101.com/r/6Qcrk1/1