使用正则表达式匹配包含可选连字符的8位电话号码。

3
我想从一段文字中提取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。

我尝试像这样硬编码:

[\b\D]([67]-?\d-?\d-?\d-?\d-?\d-?\d-?\d)[\b\D]

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


1
你不能省略匹配子字符串中的字符。你需要对匹配结果进行后处理。[x.replace('-', '') for x in re.findall(r'\b[67](?:-?\d){7}\b', data)] - Wiktor Stribiżew
1个回答

1

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

另外,请注意[\b\D]匹配一个退格字符或非数字字符。[\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)]

请查看正则表达式演示细节

  • \b - 单词边界
  • (?<!\d) - 否定回顾,如果当前位置左侧紧挨着一个数字,则匹配失败
  • [67] - 匹配67
  • (?:-?\d){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']

1
非常感谢!运行得很好,解释也非常有用。 - GusSL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接