Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python re.findall()不';t使用可选匹配(使用问号)_Python_Regex - Fatal编程技术网

Python re.findall()不';t使用可选匹配(使用问号)

Python re.findall()不';t使用可选匹配(使用问号),python,regex,Python,Regex,根据我正在阅读的一篇在线教程,其中指出: 带问号的可选匹配 有时,您只希望可选地匹配某个模式。也就是说,无论该文本位是否存在,正则表达式都应该找到匹配项。字符?将其前面的组标记为模式的可选部分。例如,在交互式shell中输入以下内容: 我的问题: 我正在尝试查找匹配的电话号码,形式为123-456-7890(无国家代码)或(111)-123-456-7890(有国家代码) 下面是我的python正则表达式代码,用于返回匹配电话号码的列表: phone_num_regex = re.compile

根据我正在阅读的一篇在线教程,其中指出:

带问号的可选匹配

有时,您只希望可选地匹配某个模式。也就是说,无论该文本位是否存在,正则表达式都应该找到匹配项。字符?将其前面的组标记为模式的可选部分。例如,在交互式shell中输入以下内容:

我的问题:

我正在尝试查找匹配的电话号码,形式为
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}')