首页 > 解决方案 > re 模块中的 Findall() 没有给我与搜索相同的结果

问题描述

所以我试图获取带有和不带有区号的电话号码列表(让我们假装电话号码是 9 位数字)

import re

def message_6():
    phone_regex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d')
    mo = phone_regex.findall("Call me at 966-123-412 or 237-128")
    print(mo)

message_6()

但是我得到的列表是 ['966-', ''] 我希望它输出这样的列表 ['966-123-412', '237-128']

标签: pythonpython-3.x

解决方案


正则表达式仅捕获括号内的内容()。因此,您必须将整个正则表达式放入其中:

import re

def message_6():
    phone_regex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d')
    mo = phone_regex.findall("Call me at 966-123-412 or 237-128")
    print(mo)

message_6()

但随后返回两个值的元组。
为什么?
那是因为您有两个捕获组。一个用于整数,一个用于可选部分。因此,您可以在捕获组的开头插入?:以在结果中忽略它。

import re

def message_6():
    phone_regex = re.compile(r'((?:\d\d\d-)?\d\d\d-\d\d\d)')
    mo = phone_regex.findall("Call me at 966-123-412 or 237-128")
    print(mo)

message_6()

这可以按您的需要工作。

r'((?:\d{3}-){1,2}\d{3})'如果您愿意,也可以将其缩短为。


推荐阅读