re.findall表现得很奇怪

re.findall表现得很奇怪

源字符串是:

# Python 3.4.3s = r'abc123d, hello 3.1415926, this is my book'

这是我的模式:

pattern = r'-?[0-9]+(\\.[0-9]*)?|-?\\.[0-9]+'

但是,re.search可以给我正确的结果:

m = re.search(pattern, s)print(m)  # output: <_sre.SRE_Match object; span=(3, 6), match='123'>

re.findall 只是转出一个空列表:

L = re.findall(pattern, s)print(L)  # output: ['', '', '']

为什么不能re.findall给我预期的清单:

['123', '3.1415926']


潇潇雨雨
浏览 1766回答 2
2回答

HUX布斯

s&nbsp;=&nbsp;r'abc123d,&nbsp;hello&nbsp;3.1415926,&nbsp;this&nbsp;is&nbsp;my&nbsp;book'print&nbsp;re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s)escape当你使用时,你不需要两次raw mode。输出:['123', '3.1415926']返回类型也是一个列表。strings如果你想要返回类型integers和floats使用mapimport&nbsp;re,ast s&nbsp;=&nbsp;r'abc123d,&nbsp;hello&nbsp;3.1415926,&nbsp;this&nbsp;is&nbsp;my&nbsp;book'print&nbsp;map(ast.literal_eval,re.findall(r'-?[0-9]+(?:\.[0-9]*)?|-?\.[0-9]+',s))输出:&nbsp;[123, 3.1415926]

慕尼黑的夜晚无繁华

这里有两点需要注意:re.findall&nbsp;如果正则表达式模式中包含捕获组,则返回捕获的文本r'\\.'模式中的部分匹配两个连续的字符,\以及除换行符之外的任何字符。见findall参考文献:如果模式中存在一个或多个组,则返回组列表;&nbsp;如果模式有多个组,这将是一个元组列表。结果中包含空匹配,除非它们触及另一个匹配的开头。请注意,要使re.findall返回只匹配值,通常可以删除多余的捕获组(例如(a(b)c)- >&nbsp;abc)将所有捕获组转换为非捕获(即替换(为(?:),除非有反向引用引用模式中的组值(请参阅下文)使用re.finditer代替([x.group() for x in re.finditer(pattern, s)])在您的情况下,findall返回所有已捕获的文本,因为您\\在r''字符串文字中尝试匹配文字\。要匹配数字,您需要使用-?\d*\.?\d+正则表达式匹配:-?&nbsp;- 可选的减号\d*&nbsp;- 可选数字\.?&nbsp;- 可选的小数分隔符\d+&nbsp;- 1位或更多位数。见演示这是IDEONE演示:import&nbsp;re s&nbsp;=&nbsp;r'abc123d,&nbsp;hello&nbsp;3.1415926,&nbsp;this&nbsp;is&nbsp;my&nbsp;book'pattern&nbsp;=&nbsp;r'-?\d*\.?\d+'L&nbsp;=&nbsp;re.findall(pattern,&nbsp;s)print(L)
打开App,查看更多内容
随时随地看视频慕课网APP