Python正则表达式抓取中间数

时间:2015-06-24 11:15:58

标签: python regex

说我有一个看起来像这样的字符串" 53.4 -63.2 433.2"三个单独的数字。我如何只获得中间一个,所以如果数字为负,我不会忽略减号?

我设法聚集使用(\ d +)对数字进行分组并抓住多个..但我不知道要添加什么? IVe看了类似的问题,但我想我找不到类似于我想做的事情

7 个答案:

答案 0 :(得分:2)

与其他回复相反,我会给你正则表达方式,它只匹配三个数字的行。

我会这样做:捕获三个可以有一个可选的否定(? - )的数字,并且可以在(。?)\ d +后面有数字的可选点,我会在第二个上放一个组标记来检索它( - ?\ d +。?\ d +)。我可以将这些数字用随机数的空格分开\。+。

import re
m = re.search(r"-?\d+\.?\d+\s+(-?\d+\.?\d+)\s+-?\d+\.?\d+", "53.4 -63.2 433.2")
print(re.group(1))

如果您无法理解我的正则表达式,则应将其复制到https://regex101.com/#python:它会对所有内容进行解释。

您还应该查看Python re模块文档:https://docs.python.org/2/library/re.html

答案 1 :(得分:0)

您可以使用re模块。

re.search(r'(?s)^\S+\s+(\S+)', stri).group(1)

示例:

>>> import re
>>> s = ["""53.4
-63.2 433.2""", """53.4 -63.2 433.2""", """53.4 -63.2
 433.2"""]
>>> [re.search(r'(?s)^\S+\s+(\S+)', i).group(1) for i in s]
['-63.2', '-63.2', '-63.2']

答案 2 :(得分:0)

如果每行总有3个数字,用空格分隔,那么正则表达式有点矫枉过正。这样的事情就足够了:

numbers = []
for line in infile:
    numbers.append(line.split()[1])

答案 3 :(得分:0)

我希望这会有所帮助:

str_num =  "53.4 -63.2 433.2"
list_num = str_num.split("\t")

# Now print the middle item by using lenght of list divided by 2.
middle = list_num[len(list_num)/2]

这适用于任何长度的列表。因此,您不必对索引进行硬编码

答案 4 :(得分:0)

如果您正在阅读文件,可以使用以下内容:

import csv

reader = csv.reader(open("numbers.txt", "rb"), delimiter=" ")

for row in reader:
    if len(row) == 3:
        print row[1]

如前所述,使用正则表达式似乎有些过分。

答案 5 :(得分:0)

假设您的数据具有样本multiline_string的形式,您可以逐行迭代字符串,方法是将每行iteratorsplit()分成几组。如果确切的三组采取中间一组并将字符串转换为浮点数。将提取的数字(浮点数)传递给abs()以获得绝对值:

#!/usr/bin/env python3
# coding: utf-8

multiline_string = """
123 -456 789
101 102 103
35.7 -43.8 21.8  
10. 10.2 10.3
"""

for line in iter(multiline_string.splitlines()):
    groups = line.split()
    if len(groups) == 3:
        number = abs(float(line.split()[1]))
        print(number)

答案 6 :(得分:0)

def middle_floats(filename):
    with open(filename) as lines:
        for line in lines:
            yield line.split()[1]