Regex匹配8位数字的电话,每个数字之间有可选的连字符



我想从一个段落中提取8位数字。它可以在数字之间的任何地方包含一个可选的连字符,并且必须以6或7开头,因此以下内容应该匹配:

71234567
6-1234567
7-123-4567
61-23-45-67
7-1-2-3-4-5-6-7
...

我只想提取数字,所以当匹配7-1-2-3-4-5-6-7时,它只返回71234567。

我试着像这样硬编码:

[bD]([67]-?d-?d-?d-?d-?d-?d-?d)[bD]

,然后手动删除连字符,但它不起作用。

不能从匹配的子字符串中省略字符。你需要后处理你的匹配。

另外,请注意[bD]匹配退格字符或非数字字符。[b]不匹配字边界

可以使用

numbers = [x.replace('-', '') for x in re.findall(r'b[67](?:-?d){7}b', data)]
# or, if the number can be glued to a letter or underscore
numbers = [x.replace('-', '') for x in re.findall(r'(?<!d)[67](?:-?d){7}(?!d)', data)]

参见regex演示。细节:

  • b - a字边界
  • (?<!d) -如果当前位置
  • 的左边有一个数字,则反向查看匹配失败
  • [67] - 67
  • (?:-?d){7} -可选-和数字序列出现7次
  • (?!d) -如果当前位置的右边有一个数字,则会导致匹配失败。

查看Python演示:

import re
data = '71234567 6-1234567 7-123-4567  61-23-45-67  7-1-2-3-4-5-6-7'
print([x.replace('-', '') for x in re.findall(r'b[67](?:-?d){7}b', data)])
# => ['71234567', '61234567', '71234567', '61234567', '71234567']

最新更新