我无法想象从这个文件中读取的方式,只有整数:
34
-1
2 48
+0
++2
+1
2.4
1000
-0
three
-1
该函数应该返回:
[34, -1, 0, 1, -1]
如果某个号码+
或-
有效。但如果它有++
或任何字母不是。
如果它有空格(例如2 48
)则无效。
如果是> 999无效。
我只被困在这里:
my_list = []
with open('test.txt') as f:
lines = f.readlines()
for line in lines:
my_list.append(line.strip())
我尝试将其设为字符串并使用translate
使用标点符号,但我不确定它是否会变得更复杂。
另外,我不确定使用正则表达式。我尝试了一个简单的正则表达式,但我没有使用它的经验。
答案 0 :(得分:7)
您可以使用int()
将字符串转换为整数。如果string不是整数,它将抛出ValueError
。所以试试这个:
my_list = []
with open('test.txt') as f:
for line in f:
try:
n = int(line)
if n > 999 or line.strip() == '-0': continue #filtering numbers >999 and strings with '-0'
my_list.append(n)
except ValueError:
pass
print(my_list)
输出:[34, -1, 0, 1, -1]
答案 1 :(得分:4)
如果你想通过正则表达式这样做:
import re
exp = re.compile(r'^[\+,\-]?[0-9]{1,3}$')
my_list = []
with open('input.txt') as f:
lines = f.readlines()
for line in lines:
if re.match(exp, line.strip()):
my_list.append(int(line.strip()))
让我们解释正则表达式。
^[\+,\-]?
- ^
表示表达式必须以下一个限定符开头,这两个限定符是两个字符\+
和\-
的列表。我们需要在那里使用转义斜杠实际放入特殊字符。最后?
使前面的参数可选(因此字符串可以以+或 - 开头,或者什么都没有)。
[0-9]{1,3}$
- [0-9]
指定数字字符集。 {1,3}
指定它们应至少出现一次,或最多出现3次(因此满足<999
约束。$
符号匹配字符串的结尾,因此字符串必须以这组字符结束。
希望这一切都有所帮助。
答案 2 :(得分:3)
如果您想手动执行此操作(请注意,regex
解决方案或调用int
可能更合适,但这些已在其他答案中介绍过),那么您也可以自己实施每项检查:
import string
characters_and_whitspaces = set(string.ascii_letters + ' .')
mylist = []
for line in lines:
# remove leading and trailing whitespaces
val = line.strip()
# Check if valid (!= -0)
if val == '-0':
continue
# Must not start with ++, +-, ....
if val.startswith(('++', '+-', '-+', '--')):
continue
# Must not contain letters or whitespaces or a dot
if characters_and_whitspaces.intersection(val):
continue
# Must only contain 3 or less digits (<= 999) or 4 if it starts with + or -
if val.startswith(('+', '-')):
if len(val) >= 5):
continue
elif len(val) >= 4:
continue
# Remove leading "+"
val = val.lstrip('+')
mylist.append(val)
答案 3 :(得分:2)
这是一个正则表达式解决方案:
import re
rgx = re.compile(r'^\s*[-+]?\s*(?:0|0*\d{1,3})\s*$', re.M)
with open('test.txt') as f:
my_list = [int(match) for match in rgx.findall(f.read())]
输出:
[34, -1, 0, 1, 0, -1]
答案 4 :(得分:0)
我认为正则表达式是你的选择。你可以用这样的东西来实现你想要的东西:[-+]?\d*
它寻找一个+或 - ,问号意味着可选,然后是任意数量的数字。
为您的案例找到正确的正则表达式的简单方法是https://regex101.com/。您可以直接查看正则表达式匹配的内容,并向您解释。在python中,re模块(https://docs.python.org/2/library/re.html)
希望这会对你有所帮助。