如果我有url
examle/def/5/
,我尝试使用
int
中找到url
值
re.findall([0-9],'examle/def/5/')
但是我收到了错误。
Traceback(最近一次调用最后一次):文件“”,第1行,in 在findall返回文件“/usr/lib/python2.7/re.py”,第177行 _compile(pattern,flags).findall(string)文件“/usr/lib/python2.7/re.py”,第229行,在_compile中p = _cache.get(cachekey)TypeError:unhashable type:'list'
我该怎么做?
答案 0 :(得分:8)
确保导入re
。
>>> import re
将第一个参数作为字符串对象传递。 (引号[0-9]
没有等同于[-9]
的列表文字。)
>>> re.findall('[0-9]','examle/def/5/')
['5']
顺便说一句,您可以使用\d
代替[0-9]
来匹配数字(使用r'raw string'
您无需转义\
):
>>> re.findall(r'\d','examle/def/5/')
['5']
>>> re.findall(r'\d','examle/def/567/')
['5', '6', '7']
如果您想要返回单个数字而不是多个数字,请使用\d+
:
>>> re.findall(r'\d+','examle/def/567/')
['567']
答案 1 :(得分:1)
使用“正则表达式”
可能很容易虽然它很强大但它也很危险
我不知道你的确切要求,
如果你想从uri中的任何位置提取数字,是的,建议的解决方案是有效的
>>> re.findall('[0-9]','examle/def/5/')
['5']
但我想你想从uri的“固定地方”获得数字。 如果是,您可能不希望这个结果
>>> re.findall('[0-9]','examle5/def/5/')
['5', '5']
我相信你可以修改正则表达式模式来完成这个,但是我会尽量避免正则表达式,因此我会这样做
>>> 'examle5/def/5/'.split('/')[-2]
'5'
如果你想使用提取的值,那么
try:
int('examle5/def/5/'.split('/')[-2]) =>> will produce 5 (without quotes)
except ValueError:
<<your code to handle when integer not present in url)
答案 2 :(得分:0)
在没有正则表达式的情况下采用不同的方式。
from string import digits
url = 'examle/def/5/'
nums = [i for i in list(url) if i in list(digits)]
return "".join(nums)