Python 正则表达式工作错误,匹配意外事件

Python 正则表达式工作错误,匹配意外事件,python,regex,Python,Regex,我有一个正则表达式: [\(\+\[]?[0-9]([\-\)\.\/-\]]?\s?\(?[0-9\s\)]){8,20}? 它必须只匹配电话号码,但也匹配以下内容: [95.86.22.137] 95.86.22.137 (192.168.1.94) 274.1363525390625px;"> 2014-8-720:32:45 有人能帮我纠正一下这个正则表达式吗?如果你真的想纠正这个问题,我会重新开始,首先确定你想要匹配的模式,这在你的正则表达式中并不明显,也不在你的问题中-只是

我有一个正则表达式:

[\(\+\[]?[0-9]([\-\)\.\/-\]]?\s?\(?[0-9\s\)]){8,20}?
它必须只匹配电话号码,但也匹配以下内容:

[95.86.22.137]
95.86.22.137
(192.168.1.94)
274.1363525390625px;">
2014-8-720:32:45

有人能帮我纠正一下这个正则表达式吗?

如果你真的想纠正这个问题,我会重新开始,首先确定你想要匹配的模式,这在你的正则表达式中并不明显,也不在你的问题中-只是你不想要的。你需要把它看作是“我想要什么?”,而不是“我想排除什么?”。按照“我想要什么?”的方式去做,你所需要的将消除所有那些讨厌的其他可能性

您必须首先决定接受什么样的“有效电话号码”。请记住,即使在NANP(北美编号计划)中,也有以下几种不同的格式:

  • XXX-XXX-XXXX或
  • XXX XXX-XXXX或
  • 1-XXX-XXX-XXXX或
  • (三十) XXX-XXXX或
  • +(三十) XXX-XXXX或
  • 1(XXX)XXX-XXXX
所有这些都是有效的数字,所以你必须决定你接受的格式。然后在世界其他地方有不同的格式,长度从9(葡萄牙)到13(韩国)不等,包括国家和国际代码。所以你必须决定:

  • 您只接受NANP号码,还是接受该标准以外的其他号码
  • 你会接受“+”还是让他们写国际代码?如果您需要代码,您的用户将输入的国家/地区的代码是否有一组数字?如果他们输入代码,您的正则表达式是否能够处理(如果可以接受)或红旗(如果不可以接受)
  • 你会在区号周围加上括号,只是允许(让括号成为可选的),还是干脆拒绝
在最后一个问题上,请注意,不同的国家在其编号中的不同位置有括号,即墨西哥有两位数的区号(顺便说一句,不在NANP中)

请记住,每次你做出这些需要某个字符的决定时,你都在否定其他可能的、有效的电话号码,除非你也允许其他有效字符出现在该插槽中。这就是为什么对你的问题没有一刀切的解决方案。出于这个原因,许多人会告诉你只需去掉“+”、“(“,”)、“-”,然后数一数数字。但是如果你认为NANP数字中的“1”是必须的,但没有人包括(因为它在NANP中通常是可选的),或者当不同国家的数字有不同的数字时,即使在他们自己的国家,比如新西兰。

这就是所谓的综合指南:

但我发现它在解决诸如如何让一个人输入“+”对“1”和空格(用于NANP数字)、如何强制使用括号、连字符等问题上非常缺乏。它给了你正则表达式,而不是解释如何达到目的。因此,我的“博客”,在这里,一个答案

以下是我将接受的严格NANP正则表达式:

  • +(三十) XXX-XXXX
  • 1(XXX)XXX-XXXX
  • (三十) XXX-XXXX
它需要括号和连字符,我相信对于NANP数字,这在符合标准的同时提供了很大的灵活性。我不处理国际(NANP以外)号码,幸运的是:

/^(\+|1\s)?[(][2-9]\d{2}[)][\s][2-9]\d{2}-\d{4}$/
/^
=单词开头匹配;基本上只是指示表达式的开始

(\+\124; 1\s)?组
  • 括号用于偏移组,并通过末尾的
    表示其中的任何字符都是可选的,并允许在其中使用“或”条件(请参见管道字符)
  • \+
    =转义“+”,以允许在加号上进行匹配(必须转义,因为它是正则表达式中的关键字符,使用反斜杠)
  • |
    =管道字符,表示它应该匹配组中左侧或右侧的字符
  • 1\s
    =需要数字1和空格字符。
    []
    不需要空间-这对我不起作用,尽管我看到其他帖子似乎表明了这一点。它是
    \s
[(]
=这是表示需要使用圆括号的方式

[2-9]\d{2}群
  • [2-9]
    =这是为了使表达式与数字2-9匹配。这是因为在NANP中,0和1在区号开头(第一组3个号码)或电话交换机(第二组3个号码)中是无效的号码
  • \d{2}
    =这表示允许0-9之间的两位数字。这是
    [0-9][0-9]
    的缩写
对于000-999之间的三位数组,您只需说:
\d{3}

[)]
=这是表示需要使用闭括号的方式

[\s]
=这需要一个空格

[2-9]\d{2}-\d{4}群
  • 连字符前面的第一部分与前面相同
  • 在此处设置连字符将需要它。如果您将
    -?
    ,它将是可选的
  • \d{4}
    =这表示允许0-9之间的4位数字。这是
    [0-9][0-9][0-9][0-9][0-9]
$/
=表示匹配单词的结尾;基本上只是表示表达式的结尾


希望这将帮助您构建表达式。

您可以使用regex101来调试它。我已经花了半天的时间来调试它,但我无法通过定义电话号码的确切含义,即它应该包含的内容和不应该在此处看到的内容,使它变得完美,可能会有帮助:也许你应该描述一下你来自哪里的电话号码是如何形成的。