下面的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+))?
发布于 2010-10-06 01:04:18
如果您有兴趣学习Regex,您可以尝试自己编写它。这并不像想象的那么难。像RegexPal这样的站点允许您输入一些测试数据,然后根据这些数据编写和测试正则表达式。使用RegexPal,尝试添加一些您希望找到的不同格式的电话号码(带有括号、区号等),获取一个Regex小手册,看看你能得到多远。如果没有其他的,它将有助于阅读其他人的表达。
编辑:这是一个修改版本的Regex,它也应该匹配没有任何连字符、空格或点的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})
它匹配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
发布于 2013-12-10 10:38:23
--这是建立一个电话号码刮除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)
发布于 2015-03-04 20:18:06
我认为这个正则表达式对于解析电话号码非常简单。
re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
https://stackoverflow.com/questions/3868753
复制相似问题