我想从一个段落中提取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]
-6
或7
-
(?:-?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']