Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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正则表达式_Python_Regex - Fatal编程技术网

用于将电话与分隔符匹配的Python正则表达式

用于将电话与分隔符匹配的Python正则表达式,python,regex,Python,Regex,此正则表达式应匹配带或不带分隔符的电话号码: phonePattern = re.compile(r'^(\d{3})\D*(\d{3})\D+(\d{4})\D*(\d*)$') 它适用于以下电话号码:800-555-1212-1234,但如果是:80055512121234,则仍然不匹配 即使我正在使用*来表示零个或多个非空白字符。您的regexp中有\D+(一个或多个非数字)。此外,您不希望有零个或多个分隔符。您希望只使用一个分隔符,或者根本不使用分隔符,因此: ^(\d{3})\D?(

此正则表达式应匹配带或不带分隔符的电话号码:

phonePattern = re.compile(r'^(\d{3})\D*(\d{3})\D+(\d{4})\D*(\d*)$')
它适用于以下电话号码:
800-555-1212-1234
,但如果是:
80055512121234
,则仍然不匹配


即使我正在使用
*
来表示零个或多个非空白字符。

您的regexp中有
\D+
一个或多个非数字)。此外,您不希望有零个或多个分隔符。您希望只使用一个分隔符,或者根本不使用分隔符,因此:

^(\d{3})\D?(\d{3})\D?(\d{4})\D?(\d*)$
无论如何,如果您不想匹配类似于
123a456b7890c
,我会使用
-
而不是非数字(
\D
):

^(\d{3})-?(\d{3})-?(\d{4})-?(\d*)$
正则表达式(大写):

  • ^
    :字符串的开头
  • (\d{3})
    :一组3位数字
  • -?
    :无或单破折号
  • (\d*)
    :一组零或多个数字
  • $
    :字符串结尾
此外,我还可以从中推荐这一章以供进一步阅读


更新:Josh Smeaton在评论中提出了一个很好的观点。根据您的使用情况,可能更容易先清理字符串(即删除破折号),然后验证只是检查字符串中的所有字符是否都是数字以及长度是否正确。如果您要将这些电话号码存储在某个地方,最好使用通用格式,而不是一次带破折号和一次不带破折号。

您的regexp中有
\D+
一个或多个非数字)。此外,您不希望有零个或多个分隔符。您希望只使用一个分隔符,或者根本不使用分隔符,因此:

^(\d{3})\D?(\d{3})\D?(\d{4})\D?(\d*)$
无论如何,如果您不想匹配类似于
123a456b7890c
,我会使用
-
而不是非数字(
\D
):

^(\d{3})-?(\d{3})-?(\d{4})-?(\d*)$
正则表达式(大写):

  • ^
    :字符串的开头
  • (\d{3})
    :一组3位数字
  • -?
    :无或单破折号
  • (\d*)
    :一组零或多个数字
  • $
    :字符串结尾
此外,我还可以从中推荐这一章以供进一步阅读


更新:Josh Smeaton在评论中提出了一个很好的观点。根据您的使用情况,可能更容易先清理字符串(即删除破折号),然后验证只是检查字符串中的所有字符是否都是数字以及长度是否正确。如果您要将这些电话号码存储在某个地方,最好使用通用格式,而不是一次带破折号,一次不带破折号。

您的第二个\D后跟+——这将匹配一个或多个非数字。将其替换为*将匹配第二个字符串,因此您的regexp如下所示:

“^(\d{3})\d*(\d{3})\d*(\d{4})\d*(\d*)$”

然而,正如erip和Dawid Ferrezy所建议的,使用“?”可能是一个好主意,它最多可以匹配一个字符:


'^(\d{3})\d?(\d{3})\d?(\d{4})\d?(\d*)$”

您的第二个\d后跟+——这将匹配一个或多个非数字。将其替换为*将匹配第二个字符串,因此您的regexp如下所示:

“^(\d{3})\d*(\d{3})\d*(\d{4})\d*(\d*)$”

然而,正如erip和Dawid Ferrezy所建议的,使用“?”可能是一个好主意,它最多可以匹配一个字符:


^(\d{3})\d?(\d{3})\d?(\d{4})\d?(\d*)$”

我给你一个提示:
意味着可选。除非确切的分隔符位置真的很重要,否则
重新匹配('\d{5,20}',n.replace('-','')
就可以了。只需修改最小/最大长度。或者,更简单地说,
n.replace('-','').isdigit()
@JoshSmeaton一直喜欢这种方法,之后可以重新格式化为您想要的格式并显示出来。@nsalem您解决了问题吗?如果是的,这里的任何一个答案都帮助了你,请考虑接受它作为一个答案。它将帮助其他人更容易地找到正确的答案。我给你一个提示:
表示可选。除非确切的分隔符位置确实重要,否则
re.match('\d{5,20}',n.replace('-','')
将起作用。只需修改最小/最大长度。或者,更简单地说,
n.replace('-','').isdigit()
@JoshSmeaton一直喜欢这种方法,之后可以重新格式化为您想要的格式并显示出来。@nsalem您解决了问题吗?如果是的,这里的任何一个答案都帮助了你,请考虑接受它作为一个答案。它将帮助其他人更容易地找到正确的答案。我还建议使用
-
,而不是
\D
。整体质量回答+1我还建议使用
-
,而不是
\D
。整体质量回答+1.