我正在制作一份声明,说电话号码格式是可以接受的。如果没有,则生成一个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)
有关此的任何提示吗?
答案 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 强>:
答案 2 :(得分:0)
我不会专注于python代码,但是与正则表达式相关,你可以使用这样的正则表达式:
^(?:\(\d{3}\) ?|\d{3}-)\d{3}-\d{4}$
<强> Working demo 强>
我的想法是交替检查字符串是如何开始的,并为结尾部分设置一个共同的模式
答案 3 :(得分:-3)
这是重复的,但这是一个有效的解决方案:(?:(?:\([0-9]*?\))|(?:[0-9]*)[- ])*