正则表达式findall()只返回[]

时间:2017-11-04 23:48:26

标签: python regex

我正在尝试运行以下行,并期望Python返回['402-292-2345'],但我从Shell获得的所有内容都是'[]',就像下面的最后一行一样。我究竟做错了什么? (注意:我编辑了下面的原始代码以反映缺失的破折号。)

LATER EDIT:出现了另外一个问题,我认为这与使用IDLE的文本编辑器并从那里运行Shell有关。 在您的几条评论之后,我直接在Shell中运行了下面的行,并在

下面返回#2

从文本编辑器中删除它:

phoneRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
resume = '''IM A SAMPLE 1234 North 55 Street Bellevue, Nebraska 68005 402-292-­2345 iasample@aol.com PROFESSIONAL REFERENCES Name Attaboy Company'''
phoneRegex.findall(resume)
[]

然后#2我直接在Shell中运行它:

phoneRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

resume = '''IM A SAMPLE 1234 North 55 Street Bellevue, Nebraska 68005 402-292-2345 iasample@aol.com PROFESSIONAL REFERENCES Name Attaboy Company'''

phoneRegex.findall(resume)

返回 ['402-292-2345']如预期的那样。

所以,这直接在Shell中运行,但在IDLE的文本编辑器中没有。

1 个答案:

答案 0 :(得分:3)

phoneRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')

此模式试图匹配3个数字,然后是短划线,3个数字和短划线,最后是4个数字。

Regexp find将无法转换输入格式,只能搜索它。要匹配您指出的数字,请尝试以下正则表达式

"\d{3}-\d{7}"

(可以使用大括号进行重复,使正则表达式更容易阅读)

编辑:对于更通用的解决方案(例如,您不知道确切的输入格式),您可以尝试这样的事情

(?:\d[\- ]?){10}

这将匹配一个10位数的字符串,可能是单个空格或破折号分隔部分/全部/全部数字。

括号后面有趣的?:将括号标记为不匹配,这实际上意味着将显示整个匹配,而不仅仅是括号内容。