strings = ["1 asdf 2", "25etrth", "2234342 awefiasd"] #and so on
获取[1, 25, 2234342]
的最简单方法是什么?
如果没有像(^[0-9]+)
这样的正则表达式模块或表达式,
答案 0 :(得分:2)
new = []
for item in strings:
new.append(int(''.join(i for i in item if i.isdigit())))
print new
[1, 25, 2234342]
答案 1 :(得分:2)
可以编写一个辅助函数来提取前缀:
def numeric_prefix(s):
n = 0
for c in s:
if not c.isdigit():
return n
else:
n = n * 10 + int(c)
return n
使用示例:
>>> strings = ["1asdf", "25etrth", "2234342 awefiasd"]
>>> [numeric_prefix(s) for s in strings]
[1, 25, 2234342]
请注意,当输入字符串没有数字前缀时(例如空字符串),这将产生正确的输出(零)。
根据Mikel的解决方案,可以编写一个更简洁的numeric_prefix定义:
import itertools
def numeric_prefix(s):
n = ''.join(itertools.takewhile(lambda c: c.isdigit(), s))
return int(n) if n else 0
答案 2 :(得分:1)
正则表达式的基本用法:
导入重新
strings = [“1asdf”,“25etrth”,“2234342 awefiasd”]
regex = re.compile('^(\ d *)')
表示字符串中的s:
mo = regex.match(s)
print s, '->', mo.group(0)
1asdf - > 1
25etrth - > 25
2234342 awefiasd - > 2234342
答案 3 :(得分:1)
所以你只需要前导数字?你想避免正则表达式吗?可能会有更短的东西,但这是显而易见的解决方案。
nlist = []
for s in strings:
if not s or s[0].isalpha(): continue
for i, c in enumerate(s):
if not c.isdigit():
nlist.append(int(s[:i]))
break
else:
nlist.append(int(s))
答案 4 :(得分:1)
基于sahhhm的答案,您可以使用takewhile
解决“1 asdf 1”问题。
from itertools import takewhile
def isdigit(char):
return char.isdigit()
numbers = []
for string in strings:
result = takewhile(isdigit, string)
resultstr = ''.join(result)
if resultstr:
number = int(resultstr)
if number:
numbers.append(number)