re python要么是要么是要求

时间:2017-09-22 21:32:52

标签: python regex

我正在制作一份声明,说电话号码格式是可以接受的。如果没有,则生成一个ValueError。

可接受: (xxx)xxx-xxxx, (XXX)XXX-XXXX, XXX-XXX-XXXX

不可接受: xxx xxx-xxxx, xxx xxx xxxx, (xxx-xxx-xxxx

我的表达适用于可接受的表达式,但它仍适用于不可接受的情况。我不确定如何输入只能在第3和第4个数字之间留出空格的表达式。然后确保区号具有两个括号

r'\s*\(*(\d{3})\)*\s*\-*(\d{3})\-*(\d{4})\s*'

在输入电话号码字符串时,我也试图创建一个由3组组成的元组。

phonenum=re.compile(r'\s*\(*(\d{3})\)*\s*\-*(\d{3})\-*(\d{4})\s*',re.VERBOSE).match('(123) 324244-123').groups()
print(phonenum)

有关此的任何提示吗?

4 个答案:

答案 0 :(得分:0)

你可以试试这个:

import re
s = "(136) 923-2521"
data = re.findall("(\(\d{3}\)\s*\d{3}-\d{4})|((?<!\()\d{3}-\d{3}-\d{4})", s)
if data and data[0][0] == s:
   pass #condition met

进一步测试:

s =  ["(452) 342-2323", "(132)243-2423", "132-423-45242", "4523 432-2321", "232 452 2324", "(232-232-4221"]
for number in s:
    print (number, re.search("(\(\d{3}\)\s*\d{3}-\d{4})|((?<!\()\d{3}-\d{3}-\d{4})", number).group(0) if re.search("(\(\d{3}\)\s*\d{3}-\d{4})|((?<!\()\d{3}-\d{3}-\d{4})", number) is not None else None)

输出:

('(452) 342-2323', '(452) 342-2323')
('(132)243-2423', '(132)243-2423')
('132-423-45242', '132-423-4524')
('4523 432-2321', None)
('232 452 2324', None)
('(232-232-4221', None)

答案 1 :(得分:0)

以下是一些代码:

import re

if __name__ == "__main__":
    PREFIX_OPTION_1 = "prefix1"
    PREFIX_OPTION_2 = "prefix2"
    DIGITS3 = "digits3"
    DIGITS4 = "digits4"

    numbers = [
        "(123) 456-7890",
        "(123)  456-7890",
        "(123)456-7890",
        "123-456-7890",
        "123 456-7890",
        "123 456-7890",
        "(123 456-7890",
    ]
    pat_str = "^((\((?P<%s>\d{3})\) ?)|((?P<%s>\d{3})-))(?P<%s>\d{3})-(?P<%s>\d{4})$"\
              % (PREFIX_OPTION_1, PREFIX_OPTION_2, DIGITS3, DIGITS4)
    pat = re.compile(pat_str)
    for number in numbers:
        match = pat.match(number)
        if match:
            print("'{}' matches to: '{}', '{}', '{}'".format(
                number, match.group(PREFIX_OPTION_1) or match.group(PREFIX_OPTION_2),
                match.group(DIGITS3), match.group(DIGITS4)))

<强>输出

c:\Work\Dev\StackOverflow\q46373507>c:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe a.py
'(123) 456-7890' matches to: '123', '456', '7890'
'(123)456-7890' matches to: '123', '456', '7890'
'123-456-7890' matches to: '123', '456', '7890'

<强> @ EDIT0

  • 感谢@Rawing和@GenXeral的评论改编的解决方案
  • 备注
    • 在定义模式I时,使用旧的字符串格式化样式,因为我不想通过加倍括号来使其复杂化,因为新样式需要我们的案例(检查[Python]: PEP 3101 -- Advanced String Formatting
    • 它不能很好地扩展(关于前缀格式),每次添加新的前缀格式时,代码(除了模式字符串本身)都需要更改

答案 2 :(得分:0)

我不会专注于python代码,但是与正则表达式相关,你可以使用这样的正则表达式:

^(?:\(\d{3}\) ?|\d{3}-)\d{3}-\d{4}$

enter image description here

<强> Working demo

我的想法是交替检查字符串是如何开始的,并为结尾部分设置一个共同的模式

答案 3 :(得分:-3)

这是重复的,但这是一个有效的解决方案:(?:(?:\([0-9]*?\))|(?:[0-9]*)[- ])*