Python re模块中的Findall()未给出与搜索相同的结果

Python re模块中的Findall()未给出与搜索相同的结果,python,python-3.x,Python,Python 3.x,所以我试图得到一个有区号和没有区号的电话号码列表(让我们假设电话号码是9位数字) 然而,我得到的列表是['966-',''] 我希望它输出这样的列表['966-123-412','237-128']Regex只捕获括号内的内容()。所以你必须把整个正则表达式放进去: 重新导入 def消息_6(): phone\u regex=re.compile(r'(\d\d\d-?\d\d\d-\d\d\d') mo=phone_regex.findall(“拨打966-123-412或237-128联系我

所以我试图得到一个有区号和没有区号的电话号码列表(让我们假设电话号码是9位数字)

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

Regex只捕获括号内的内容
()
。所以你必须把整个正则表达式放进去:

重新导入
def消息_6():
phone\u regex=re.compile(r'(\d\d\d-?\d\d\d-\d\d\d')
mo=phone_regex.findall(“拨打966-123-412或237-128联系我”)
打印(mo)
信息_6()
然后返回两个值的元组。
为什么?
这是因为您有两个捕获组。一个用于整数,一个用于可选部分。因此,您可以在捕获组的开头插入
?:
,以便在结果中忽略它

重新导入
def消息_6():
phone\u regex=re.compile(r'(((?:\d\d\d-)?\d\d\d-\d\d))
mo=phone_regex.findall(“拨打966-123-412或237-128联系我”)
打印(mo)
信息_6()
这是你需要的


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

您的意思是
\d\d\d-\d\d(-\d\d)?
。另外,像这里一样在线检查您的正则表达式:但对于相同的示例81724891791-12491-401-2401-40,您的代码给出['791-124','401-240']@Pygirl,但这与问题的作者要求的行为相同。因为否则只是一种意见,什么应该被接受,什么不应该被接受。但你的答案也与类似于
'12'
的东西匹配,我认为这是一个更好的例子。明白了。谢谢你的澄清。
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()