用于电话号码的Python正则表达式

问题描述 投票:1回答:1

我是正常表达的新手,并寻求帮助解析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']

任何建议或帮助都非常感谢。谢谢

python regex python-3.x regex-greedy
1个回答
3
投票

我建议使用这种模式:

(?:\B\+ ?49|\b0)(?: *[(-]? *\d(?:[ \d]*\d)?)? *(?:[)-] *)?\d+ *(?:[/)-] *)?\d+ *(?:[/)-] *)?\d+(?: *- *\d+)?

regex demo。请注意,它是基于your comment写的,电话号码以+490开头,并在您提供的示例列表中。由于您没有提供更具体的电话号码提取规则,因此可能会将其视为“正在进行中”。

图案细节

  • (?:\B\+ ?49|\b0) - 一个+,可选空间,490,两个子串都不能以字符char开头
  • (?: *[(-]? *\d(?:[ \d]*\d)?)? - 一个匹配0+空格的可选子串,然后是一个可选的(-,0 +空格,一个数字,然后是一个数字/空格的可选序列,后跟一个数字
  • *(?:[)-] *)? - 0+空格,然后是)-的可选序列,后跟0+空格
  • \d+ - 1+位数
  • * - 0+空格
  • (?:[/)-] *)? - /)-的可选序列,后跟0+空格
  • \d+ - 1+位数
  • *(?:[/)-] *)? - 0+空格,然后是/)-的可选序列,后跟0+空格
  • \d+ - 1+位数
  • (?: *- *\d+)? - 可选序列:0+空格,-,0 +空格,1 +位数。
© www.soinside.com 2019 - 2024. All rights reserved.