我有一个非常具体的挑战。我正在解析命令行字符串,除了特定的数字模式之外,我需要除去所有内容。例如:
str = 'abd-256PA\r\n20db'
我想得到这个数字20!我该怎么做呢?请注意,有时候这个数字可能是'abc-256\r\n0db'
这样的单个数字。字符串不一定包含'\r\n'
。
我尝试了rstrip
,lstrip
,strip
,[:]
以及其他一些事情但没有成功。
答案 0 :(得分:3)
如果您寻找的数字始终位于字符串的末尾,则可以使用此类正则表达式获取它:([0-9]+)[^0-9]*$
示例程序:
import re
print re.search(r'([0-9]+)[^0-9]*$','abd-256PA\r\n20db').group(1)
示例输出:
20
测试程序:
import re
str = ['abd-256PA\r\n20db',
'abc-256\r\n0db',
'abc-256aa0db',
'uio1289248282dasd1786ddass',
'12',
'2101a123aasdqwqwe']
for x in str:
print '"%s" >> "%s"' %(x, re.search(r'([0-9]+)[^0-9]*$',x).group(1))
测试输出:
"abd-256PA
20db" >> "20"
"abc-256
0db" >> "0"
"abc-256aa0db" >> "0"
"uio1289248282dasd1786ddass" >> "1786"
"12" >> "12"
"2101a123aasdqwqwe" >> "123"
按要求说明:
Python有一个正则表达式模块re,它有一个名为search的函数,它试图在给定的字符串中查找给定的正则表达式匹配。
基本上,这就是([0-9]+)[^0-9]*$
的含义:
[0-9]
0到9之间的任何数字[0-9]+
从0到9 [^0-9]
任何字符,但从0到9 [^0-9]*
0个或更多字符的序列,其中没有0到9之间的数字$
字符串结尾(...)
捕获群组,我们正在努力寻找的东西([0-9]+)[^0-9]*$
一个包含1个或多个数字的序列,后跟0个或更多个非数字,后跟字符串的结尾函数re.search有两个参数:一个正则表达式和一个用于搜索该正则表达式的字符串。它返回MatchObject类型的对象。基本上group(1)
表示"给我第一个被捕获的组" ((...)
中的那个)。
答案 1 :(得分:1)
如果您的表达式始终以“db”结尾,请尝试:
import re
d = "abd-256PA\r\n20db"
s = re.search("\d{1,2}db",d)
print d[s.start():s.end()-2]
答案 2 :(得分:1)
你可以试试这个:
str.replace('\n','').replace('\r','').replace('abc-256','').replace('abd-256','').replace('PA','').replace('db','')
它适用于您描述的两种情况。它只是用空字符串替换所有无用信息。
<强>更新强>
如果您不知道该字符串是什么,并且您只知道在您想要的数字后面有一个后缀“db”,那么您可以尝试这个正则表达式:
import re
regex=re.compile("([0-9]+)db")
str="abd-256PA\r\n20db"
parsed_number = regex.findall(str)[0]
print parsed_number