【发布时间】:2017-09-30 20:38:08
【问题描述】:
我正在尝试创建一个函数来捕获以规范形式 (XXX)XXX-XXX 或 XXX-XXX-XXXX 以及附加条件编写的电话号码。这是我的方法
def parse_phone2(s):
phone_number = re.compile(r'''^\s*\(? # Begining of string, Ignore leading spaces
([0-9]{3}) # Area code
\)?\s*|-? # Match 0 or 1 ')' followed by 0 or more spaces or match a single hyphen
([0-9]{3}) # Three digit
-? # hyphen
([0-9]{4}) # four digits
\s*$ # End of string. ignore trailing spaces''', re.VERBOSE)
try:
return (phone_number.match(s).groups())
except AttributeError as e:
raise ValueError
我在这个测试用例' (404) 555-1212 ' 失败了,但SO 的另一个问题建议我用(?:\)?\s*|-?) 替换\)?\s*|-? 并且它有效。问题是我不了解两者之间的区别,也不了解(?:...) 的目的,而不是创建非捕获组。文档对我来说也不够清楚。
【问题讨论】:
-
(?:...)可用于构造正则表达式,但与普通括号不同,它不会创建捕获组。 -
问号字符 ? 匹配一次或零次;您可以将其视为将某些内容标记为可选。例如,home-?brew 匹配 homebrew 或 home-brew。
-
@FadySaad 这不是我的问题。我在问为什么当我使用
(?:\)?\s*|-?)而不是\)?\s*|-?时我的函数通过了
标签: python regex python-3.x