说我有一个看起来像这样的字符串" 53.4 -63.2 433.2"三个单独的数字。我如何只获得中间一个,所以如果数字为负,我不会忽略减号?
我设法聚集使用(\ d +)对数字进行分组并抓住多个..但我不知道要添加什么? IVe看了类似的问题,但我想我找不到类似于我想做的事情
答案 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
的形式,您可以逐行迭代字符串,方法是将每行iterator和split()
分成几组。如果确切的三组采取中间一组并将字符串转换为浮点数。将提取的数字(浮点数)传递给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]