我想匹配一个可能是0.1234567或1.23e-5形式的浮点数 这是我的python代码:
import re
def main():
m2 = re.findall(r'\d{1,4}:[-+]?\d+\.\d+(e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345')
for svs_elem in m2:
print svs_elem
main()
它打印空白......根据我的测试,问题在(e- \ d +)?部分。
答案 0 :(得分:4)
看重点:
Help on function findall in module re: findall(pattern, string, flags=0) Return a list of all non-overlapping matches in the string. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.
你有一个群组,所以它返回而不是整个匹配,但在任何情况下它都不匹配。使用(?:e-\d+)
:
m2 = re.findall(r'\d{1,4}:[-+]?\d+\.\d+(?:e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345')
答案 1 :(得分:3)
使用非捕获组。匹配正在成功,但输出是 don
当您的输入包含e-6
:
>>> re.findall(r'\d{1,4}:[-+]?\d+\.\d+(e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345e-6')
['', '', 'e-6']
使用非捕获组((?:...)
):
>>> re.findall(r'\d{1,4}:[-+]?\d+\.\d+(?:e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345e-6')
['1:0.00003', '3:0.123456', '8:-0.12345e-6']
以下是一些简单的示例,用于演示捕获组如何工作以及它们如何影响findall
的输出。首先,没有团体:
>>> re.findall("a[bc]", "ab")
["ab"]
这里,字符串" ab"匹配正则表达式,所以我们打印正则表达式匹配的所有内容。
>>> re.findall("a([bc])", "ab")
["b"]
这一次,我们将[bc]
放在捕获组中,因此即使整个字符串仍然与正则表达式匹配,findall
仅在其输出中包含捕获组内的部分。 / p>
>>> re.findall("a(?:[bc])", "ab")
["ab"]
现在,通过将捕获组转换为非捕获组,findall
再次使用其输出中整个正则表达式的匹配。
>>> re.findall("a([bc])?", "a")
['']
>>> re.findall("a(?:[bc])?", "a")
['a']
在这两种最终情况中,正则表达式作为一个整体匹配,因此返回值是非空列表。在第一个中,捕获组本身并不匹配任何文本,因此空字符串是输出的一部分。在第二种情况下,我们没有捕获组,因此整个正则表达式的匹配用于输出。