我对正则表达式非常陌生,并寻求帮助以从HTML文本中解析出电话号码
在源站点上,html标签非常失真并且没有我可以使用的任何唯一选择器。下面是我要解析的可能性列表。
raw = """+49 39291 55-217
02102 7007064
0152 01680970
+49 39291 55-216
02102 3802 22
0800 333004 451-100
+49 221 9937 26950
02151-47974510
+49(0)6105 937 -539
0211/409 2268
+49(0)6105 937 -539
+49211/584-623
0211 58422 2012
+49 (9131) 7-35335
+49 521 9488 2470
+ 49-40-70 70 84 - 0
0211 17 95 99 04
02151-47974327
+49 203 28900 1121
0211 9449-2555
+49 (5 41) 9 98 -2268"""
我尝试了这种模式,但无法从中了解更多信息
import re, requests
Phones = re.findall(re.compile(r'.*?(\(?\d{3}\D{0,3}\d{3}\D{0,3}\d{4}).*?'),raw)
phones
['102 7007064', '152 0168097', '151-4797451', '937 -539\n0211', '937 -539\n+4921', '584-623\n0211', '151-4797432']
任何建议或帮助都将受到高度赞赏。谢谢
答案 0 :(得分:3)
我建议使用这种模式:
(?:\B\+ ?49|\b0)(?: *[(-]? *\d(?:[ \d]*\d)?)? *(?:[)-] *)?\d+ *(?:[/)-] *)?\d+ *(?:[/)-] *)?\d+(?: *- *\d+)?
请参见regex demo。请注意,它是根据your comment所说的,电话号码以+49
或0
开头,并基于您提供的示例列表。由于您尚未提供提取电话号码的更具体规则,因此可以将其视为“进行中的工作”。
模式详细信息
(?:\B\+ ?49|\b0)
-+
,可选空格,49
或0
,两个子字符串都不能以单词char开头(?: *[(-]? *\d(?:[ \d]*\d)?)?
-一个可选的子字符串,匹配0+个空格,然后是一个可选的(
或-
,0+个空格,一个数字,然后是一个可选的数字/空格序列,后跟一个数字 *(?:[)-] *)?
-0+个空格,然后是)
或-
的可选序列,后跟0+个空格\d+
-1个以上数字 *
-超过0个空格(?:[/)-] *)?
-/
,)
或-
的可选序列,后跟0+个空格\d+
-1个以上数字 *(?:[/)-] *)?
-0+个空格,然后是/
,)
或-
的可选序列,后跟0+个空格\d+
-1个以上数字(?: *- *\d+)?
-可选序列:0+个空格,-
,0+个空格,1 +个数字。