以下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+))?
答案 0 :(得分:33)
如果您对学习Regex感兴趣,可以自己动手写一下。它并不像它的那么难。像RegexPal这样的网站允许您输入一些测试数据,然后针对该数据编写和测试正则表达式。使用RegexPal,尝试添加您希望找到它们的各种格式的电话号码(使用括号,区号等),抓住Regex cheatsheet并查看您可以获得的距离。如果不出意外,它将有助于阅读其他人的表达。
编辑: 以下是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
答案 1 :(得分:16)
这是建立电话号码抓取正则表达式的过程。
首先,我们需要匹配区号(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)
答案 2 :(得分:7)
我认为这个正则表达式非常简单,可以解析电话号码
re.findall("[(][\d]{3}[)][ ]?[\d]{3}-[\d]{4}", lines)
答案 3 :(得分:1)
对于西班牙语电话号码,我使用它非常成功:
re.findall( r'[697]\d{1,2}.\d{2,3}.\d{2,3}.\d{0,2}',str)
答案 4 :(得分:0)
Dive Into Python有一个具体的例子,你在这里寻找:
http://www.diveintopython.net/regular_expressions/phone_numbers.html
答案 5 :(得分:0)
您可以查看:http://regex.inginf.units.it/。通过一些训练数据和目标,它可以为您构建一个合适的正则表达式。它并不总是完美的(检查F-score)。让我们试试15个例子:
re.findall("\w\d \w\w \w\w \w\w \w\d|(?<=[^\d][^_][^_] )[^_]\d[^ ]\d[^ ][^ ]+|(?<= [^<]\w\w \w\w[^:]\w[^_][^ ][^,][^_] )(?: *[^<]\d+)+",
"""Lorem ipsum © 04-42-00-00-00 dolor 1901 sit amet, consectetur +33 (0)4 42 00 00 00 adipisicing elit. 2016 Sapiente dicta fugit fugiat hic 04 42 00 00 00 aliquam itaque 04.42.00.00.00 facere, 13205 number: 100 000 000 00013 soluta. 4 Totam id dolores!""")
返回['04 42 00 00 00', '04.42.00.00.00', '04-42-00-00-00', '50498,']
添加更多示例以获得精确度
答案 6 :(得分:0)
由于尚无人发布此正则表达式,所以我会。这就是我用来查找电话号码的方法。它与您在美国看到的所有常规电话号码格式匹配。我不需要此正则表达式来匹配国际数字,因此无需为此而对正则表达式进行调整。
@Effect
如果您希望简单的电话号码之间没有字符匹配,请使用此模式。例如:“ 4441234567”。
phone_number_regex_pattern = r"\(?\d{3}\)?[-.\s]\d{3}[-.\s]\d{4}"
答案 7 :(得分:0)
以下是对上述答案的补充。此正则表达式还能够检测国家/地区代码:
((?:\+\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}))
它可以检测以下样本:
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