Python re.findall()不';t使用可选匹配(使用问号)
根据我正在阅读的一篇在线教程,其中指出: 带问号的可选匹配 有时,您只希望可选地匹配某个模式。也就是说,无论该文本位是否存在,正则表达式都应该找到匹配项。字符?将其前面的组标记为模式的可选部分。例如,在交互式shell中输入以下内容: 我的问题: 我正在尝试查找匹配的电话号码,形式为Python re.findall()不';t使用可选匹配(使用问号),python,regex,Python,Regex,根据我正在阅读的一篇在线教程,其中指出: 带问号的可选匹配 有时,您只希望可选地匹配某个模式。也就是说,无论该文本位是否存在,正则表达式都应该找到匹配项。字符?将其前面的组标记为模式的可选部分。例如,在交互式shell中输入以下内容: 我的问题: 我正在尝试查找匹配的电话号码,形式为123-456-7890(无国家代码)或(111)-123-456-7890(有国家代码) 下面是我的python正则表达式代码,用于返回匹配电话号码的列表: phone_num_regex = re.compile
123-456-7890
(无国家代码)或(111)-123-456-7890
(有国家代码)
下面是我的python正则表达式代码,用于返回匹配电话号码的列表:
phone_num_regex = re.compile(r'(\(\d{3}\)-)?\d{3}-\d{3}-\d{4}')
phone_num_list = phone_num_regex.findall('800-420-7240 (933)-415-863-9900 415-863-9950')
然而,我得到的电话号码列表是['”(933)-“,”
,而不是我想要的['800-420-7240'(933)-415-863-9900',415-863-9950'.
我可以知道我的密码有什么问题吗?我猜这与“?”(可选匹配)有关。您将可选部分包括在捕获组中,这意味着
re.findall
提供给您的就是这些组
如果改用非捕获组,则不会发生这种情况
re.compile(r'(?:\(\d{3}\)-)?\d{3}-\d{3}-\d{4}')
发件人:
(…)
匹配括号内的任何正则表达式,并指示组的开始和结束;组的内容可在执行匹配后检索,稍后可在字符串中与
\number
特殊序列进行匹配,如下所述。要匹配文本”(“
或”)
,请使用\(
或\)
,或将它们括在字符类中:[(]
,[)]
(?:…)
普通括号的非捕获版本。匹配括号内的任何正则表达式,但在执行匹配或稍后在模式中引用后,无法检索组匹配的子字符串
re.findall(模式、字符串、标志=0)
返回字符串中模式的所有非重叠匹配项,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配项
(我的重点)试着把第一个组设为非捕获组
(?:\(\d{3}\)-?\d{3}-\d{3}-\d{4}
注意,你通常更喜欢先将其分成电话号码组(只需str.split
就可以这样做),然后匹配每个号码。这会让你在最后的正则表达式中变得更有创意。
re.compile(r'(?:\(\d{3}\)-)?\d{3}-\d{3}-\d{4}')